文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>关于 MSDN 说 Lock 应该用private 对象锁定的测试。

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

时间:2010-08-25  来源:NewSea.

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


相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载