多线程:锁定属性 - 这是正确的吗?

hwc*_*rwe 3 c# multithreading locking properties

我写了以下代码:

static readonly object failedTestLock = new object();

public static Dictionary<string, Exception> FailedTests
{
    get
    {
        lock (failedTestLock)
        {
            return _failedTests;
        }
    }
    set
    {
        lock (failedTestLock)
        {
            _failedTests = value;
        }
    }
}

public void RunTest(string testName)
{
    try
    {
        //Run a test
    }
    catch (Exception exception)
    {
        // ?? Is this correct / threadsafe?
        FailedTests.Add(testName, exception);
    }
}
Run Code Online (Sandbox Code Playgroud)

问题:
这是否是将失败的测试安全地添加到词典中的正确方法?
这线程安全吗?
是FailedTests.Add调用INSIDE锁定还是OUTSIDE锁定?

你能解释为什么这是正确的/线程安全的,或者为什么不呢?

提前致谢

Jef*_*nal 9

上面代码的基本问题是它只锁定_failedTests线程获取字典或设置字典时的访问权限.只有一个线程可以一次获得对字典的引用,但是一旦线程具有对字典的引用,它就可以读取和操作它而不受锁的约束.

这是将失败的测试安全地添加到字典中的正确方法吗?

不,如果两个线程同时尝试添加到字典中,请不要这样做.如果您希望读取和写入按特定顺序发生,也不会发生.

这线程安全吗?

这取决于你对线程安全的意思,但不是,不是任何合理的定义.

是FailedTests.Add调用INSIDE锁定还是OUTSIDE锁定?

字典检索(get访问器)发生在锁内.Add释放锁后,此代码调用.

你能解释为什么这是正确的/线程安全的,或者为什么不呢?

如果多个线程同时在您的字典上运行,则无法预测这些线程将更改其内容的顺序,并且您无法控制何时将进行读取.


Sas*_*ein 7

这不是对字典的线程安全访问,因为只有返回字典对象的属性访问是线程安全的,但您没有同步对该Add方法的调用.ConcurrentDictionary<string,Exception>在这种情况下考虑使用,或Add手动同步呼叫.