lock 将{语句块}标记为{临界区},方法是获取给定对象的互斥锁,执行语句,然后释放该锁。
当一个互斥锁被占用时,在同一个线程中执行的代码仍可以获取和释放该锁;但是,在其他线程中执行的代码在该锁被释放前是无法获取的。

下面二种方式完全等效:
lock(x)
{
   
}

System.Threading.Monitor.Enter(x);
try
{
   
}
finally
{
   System.Threading.Monitor.Exit(x);
}
lock 锁定x变量后,x变量就不能被其他变量用了,只有等到x被释放后,其他代码才可以访问x

对于任何一个对象来说,他在内存中的第一部分放置的是所有方法的地址,第二部分放着一个索引,他指向CLR中的SyncBlock Cache区域中的一个SyncBlock.什么意思呢?就是说,当你执行Monitor.Enter(Object)时,如果object的索引值为负数,就从SyncBlock Cache中选区一个SyncBlock,将其地址放在object的索引中。这样就完成了以object为标志的锁定,其他的线程想再次进行Monitor.Enter(object)操作,将获得object为正数的索引,然后就等待。直到索引变为负数,即线程使用Monitor.Exit(object)将索引变为负数
posted on 2009-07-24 12:56  huadust  阅读(181)  评论(0编辑  收藏  举报