我正在尝试独占访问或使用单独的锁定对象的同一个对象上的lock()?

时间:2013-05-09 08:34:20

标签: c# .net multithreading thread-safety locking

private class MyClass
{
    private static MyObject myObject = new MyObject();

    private void ModifyObject()
    {
        lock(myObject)
        {
            myObject.UnsafeMethod();
        }
    }
}

锁定myObject还是必须声明另一个专用锁定对象?

2 个答案:

答案 0 :(得分:3)

没关系,任何物品都足以作为储存锁状态的地方。

在任何代码审查中都是一个强大的红旗,暗示程序员正在考虑以错误的方式锁定。在.NET中没有“锁定对象使其成为线程安全”的东西。这个概念确实存在,是许多学术研究的主题,称为STM或软件事务记忆。但是在.NET框架中没有一丝支持。

您使用锁定阻止代码。可由多个线程执行并读取或写入变量的危险代码。通常在不止一个地方,源代码文件中存在于特定位置的代码。您使用锁定以确保只有一个线程可以同时在这些特定位置执行代码。因此,锁定状态与代码段相关联,而不是对象。因此,应该要求专用对象存储这些特定部分的锁定状态。你通过拥有这样一个专门的对象来表明你知道自己在做什么,而不是只选择一个你已经存在的对象。同样强烈的自我记录,使得更容易看到发生锁定的位置,因为您只需要搜索锁定变量的名称。

答案 1 :(得分:0)

对于要同步访问的对象,lock很好,只要您可以确定锁定它的所有代码都在您的控制之下(因为否则,理论上可能会有代码你不知道锁定同一个对象并造成死锁。)

大多数情况下,你会看到专门的锁定对象:如果你想修改一个暴露的集合(例如通过一个属性),那么良好的做法要求你不能锁定集合本身。

在这种情况下,锁定目标是private,所以如果你没有明确地将它暴露给外面的世界,你就可以了。