关于 MSDN 说 Lock 应该用private 对象锁定的测试。

MSDN 说:
lock
关键字在块的开始处调用 Enter,而在块的结尾处调用 Exit

通常,应避免锁定 public 类型,否则实例将超出代码的控制范围。 常见的结构 lock (this)lock (typeof (MyType))lock ("myLock") 违反此准则:

  • 如果实例可以被公共访问,将出现 lock (this) 问题。

  • 如果 MyType 可以被公共访问,将出现 lock (typeof (MyType)) 问题。

  • 由于进程中使用同一字符串的任何其他代码都将共享同一个锁,所以出现 lock(“myLock”) 问题。

最佳做法是定义 private 对象来锁定, 或 private static 对象变量来保护所有实例所共有的数据。


Test

 

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说的是为什么。


posted @ 2010-08-25 13:32  NewSea  阅读(1103)  评论(5编辑  收藏  举报