我正在读一本描述SyncRoot模式的C#书。表明
void doThis()
{
lock(this){ ... }
}
void doThat()
{
lock(this){ ... }
}
并与SyncRoot模式进行比较:
object syncRoot = new object();
void doThis()
{
lock(syncRoot ){ ... }
}
void doThat()
{
lock(syncRoot){ ... }
}
但是,我不太了解这里的区别。似乎在这两种情况下,这两种方法一次只能被一个线程访问。
这本书描述了……因为实例的对象也可以用于从外部进行同步访问,并且您不能通过类本身来控制此形式,因此可以使用SyncRoot模式。 “实例的对象”?
谁能告诉我以上两种方法之间的区别?
最佳答案
如果您有一个内部数据结构要防止多个线程同时访问,则应始终确保锁定的对象不是公共(public)的。
其背后的原因是公共(public)对象可以被任何人锁定,因此您可以创建死锁,因为您无法完全控制锁定模式。
这意味着不能锁定this
,因为任何人都可以锁定该对象。同样,您不应锁定暴露于外界的事物。
这意味着最好的解决方案是使用内部对象,因此技巧是仅使用Object
。
锁定数据结构是您真正需要完全控制的事情,否则就有可能为死锁设置场景,这可能很难解决。
关于c# - SyncRoot模式的用途是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/728896/