我试图独占访问或使用单独的锁定对象
本文关键字:单独 锁定 对象 访问 | 更新日期: 2023-09-27 18:12:42
private class MyClass
{
private static MyObject myObject = new MyObject();
private void ModifyObject()
{
lock(myObject)
{
myObject.UnsafeMethod();
}
}
}
是否可以锁定myObject
或必须声明另一个专用锁定对象?
没关系,任何对象都可以作为存储锁状态的地方。
在任何代码审查中都是一个强烈的危险信号,暗示程序员以错误的方式考虑锁。在。net中没有"锁定对象以使其线程安全"这样的事情。这个概念确实存在,它是许多学术研究的主题,被称为STM或软件事务性内存。但是在。net框架中没有丝毫的支持。
使用锁来阻止代码。可以由多个线程执行并读取或写入变量的危险代码。通常在源代码文件中存在于特定位置的代码不止一个位置。您可以使用锁来确保只有一个线程可以同时在这些特定的位置执行代码。因此,锁状态与代码的部分相关联,而不是与对象相关联。因此需要一个专用的对象来存储这些特定部分的锁状态。通过拥有这样一个专用的对象,你可以表明你知道你在做什么,而不是随便挑一个你到处都有的对象。它还具有很强的自文档性,使得更容易看到锁发生在哪里,因为您只需要搜索锁定变量的名称。
在你想要同步访问的对象上lock
是可以的,只要你能确保锁定它的所有代码都在你的控制之下(因为否则,理论上可能会有你不知道的代码锁定同一个对象并导致死锁)。
大多数时候,你看到专用锁对象正是因为:如果你想修改一个公开的集合(例如通过属性),良好的实践规定你不能锁定集合本身。
在这种情况下,锁定目标是private
,所以如果您不显式地将其暴露给外部世界,您就可以了。