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

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

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

4

2 回答 2

3

没关系,任何对象都足以充当存储锁状态的地方。

然而,在任何代码审查中,这都是一个强烈的危险信号,暗示程序员正在以错误的方式考虑锁定。.NET 中没有“锁定对象以使其成为线程安全”之类的东西。这个概念确实存在,是许多学术研究的主题,称为 STM 或软件事务内存。但是在.NET 框架中并没有对此提供任何支持。

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

于 2013-05-09T09:27:17.123 回答
1

lock只要您可以确定锁定它的所有代码都在您的控制之下,就可以在要同步访问的对象上进行(因为否则,理论上可能存在您不知道锁定的代码)相同的对象并导致死锁)。

大多数时候,您会看到专用的锁定对象,这正是因为:如果您想修改公开的集合(例如通过属性),良好的做法是您不能锁定集合本身。

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

于 2013-05-09T08:35:49.490 回答