private class MyClass
{
private static MyObject myObject = new MyObject();
private void ModifyObject()
{
lock(myObject)
{
myObject.UnsafeMethod();
}
}
}
可以锁定 myObject
还是必须声明另一个专用锁定对象?
最佳答案
没关系,任何对象都足以充当存储锁状态的地方。
然而,这在任何代码审查中都是一个强烈的危险信号,暗示程序员正在以错误的方式考虑锁。在 .NET 中没有“锁定对象以使其线程安全”这样的事情。这个概念确实存在,许多学术研究的主题,称为 STM 或软件事务内存。但在 .NET 框架中对此没有丝毫支持。
您使用锁来阻止代码。可以由多个线程执行并读取或写入变量的危险代码。通常不止一个地方,代码存在于源代码文件的特定 地方。您使用锁来确保只有 一个 线程可以同时执行这些特定位置的代码。因此,锁定状态与代码段相关联,而不是对象。因此应该需要一个专用对象来存储那些特定部分的锁定状态。通过拥有这样一个专门的对象,您可以表明您知道自己在做什么,而不是仅仅挑选一个放在身边的对象。还具有强大的 self 记录功能,因此您只需搜索锁定变量的名称,就可以更轻松地查看发生锁定的位置。
关于c# - lock() 在同一个对象上我试图独占访问或使用单独的锁定对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16457632/