MSDN 说:
lock 关键字在块的开始处调用 Enter,而在块的结尾处调用 Exit。
-
如果实例可以被公共访问,将出现 lock (this) 问题。 -
如果 MyType 可以被公共访问,将出现 lock (typeof (MyType)) 问题。 -
由于进程中使用同一字符串的任何其他代码都将共享同一个锁,所以出现 lock(“myLock”) 问题。
class Program
{
private object obj = new object();
public void T()
{
lock (obj)
{
Console.Write("Enter");
lock (obj)
{
}
Thread.Sleep(100);
Console.WriteLine(" OK!");
}
}
static void Main(string[] args)
{
var p = new Program();
ThreadStart ts = new ThreadStart(p.T);
for (int i = 0; i < 10; i++)
{
Thread th = new Thread(ts);
th.Start();
}
}
}
实例会超出控制范围? 第二个 lock 之后, obj 就超出范围了吧,其实不然,第一个lock 依然是阻塞状态。
无论 obj 字符串,还是 typeof(Program),结果都一样。 不明白MSDN说的是为什么。