可能重复:
Difference between lock(locker) and lock(variable_which_I_am_using)
在我看过的所有“线程安全”代码示例中,它们锁定了一个单独的虚拟对象。为什么不能直接对有问题的数据执行锁定?
答案 0 :(得分:18)
锁定单独的private
虚拟对象可以保证没有其他人锁定该对象。
如果您锁定数据并且外部可以看到同一条数据,则会失去该保证。例如:
public class MyObject
{
public void SharedMethod()
{
lock (this)
{
// Do stuff
}
}
}
class Program
{
static void Main(string[] args)
{
MyObject o = new MyObject();
lock (o)
{
new Thread(() =>
{
// Gets blocked 2s because of external lock
o.SharedMethod();
}).Start();
Thread.Sleep(2000);
}
}
}
答案 1 :(得分:9)
Jeff Richter(CLR Via C#的作者)在Safe Thread Synchronization的这篇文章中解释了原因。
具体而言,在那篇文章中,“为什么伟大的想法不那么伟大”这一部分回答了你的问题。
这实际上是书CLR Via C#中的一章。
总之,将私有对象作为“synclock”对象允许您的类封装和控制您的类所需的任何锁定。因此,无论有多少客户端使用您的类,都会一致且正确地执行锁定。
答案 2 :(得分:2)