我正在阅读一本描述 SyncRoot 模式的 C# 书籍。表明
void doThis()
{
lock(this){ ... }
}
void doThat()
{
lock(this){ ... }
}
并与 SyncRoot 模式进行比较:
object syncRoot = new object();
void doThis()
{
lock(syncRoot ){ ... }
}
void doThat()
{
lock(syncRoot){ ... }
}
但是,我不太明白这里的区别;似乎在这两种情况下,这两种方法一次只能由一个线程访问。
书中描述了...因为实例的对象也可以用于从外部进行同步访问,并且您无法通过类本身来控制这种情况,因此可以使用 SyncRoot 模式呃? “实例的对象”?
谁能告诉我上面两种方法之间的区别?
如果您希望防止多个线程同时访问一个内部数据结构,则应始终确保您锁定的对象不是公共的。
其背后的原因是公共对象可以被任何人锁定,因此您可能会造成死锁,因为您无法完全控制锁定模式。
这意味着锁定this
不是一个选项,因为任何人都可以锁定该对象。同样,你不应该锁定你暴露给外界的东西。
这意味着最好的解决方案是使用内部对象,因此建议只使用Object
.
锁定数据结构是您真正需要完全控制的事情,否则您将面临设置死锁场景的风险,这可能会非常难以处理。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)