lock 将{语句块}标记为{临界区},方法是获取给定对象的互斥锁,执行语句,然后释放该锁。
当一个互斥锁被占用时,在同一个线程中执行的代码仍可以获取和释放该锁;但是,在其他线程中执行的代码在该锁被释放前是无法获取的。
下面二种方式完全等效:
lock 锁定x变量后,x变量就不能被其他变量用了,只有等到x被释放后,其他代码才可以访问x当一个互斥锁被占用时,在同一个线程中执行的代码仍可以获取和释放该锁;但是,在其他线程中执行的代码在该锁被释放前是无法获取的。
下面二种方式完全等效:
lock(x)
{
![](https://www.cnblogs.com/Images/dot.gif)
}
System.Threading.Monitor.Enter(x);
try
{
![](https://www.cnblogs.com/Images/dot.gif)
}
finally
{
System.Threading.Monitor.Exit(x);
}
{
![](https://www.cnblogs.com/Images/dot.gif)
}
System.Threading.Monitor.Enter(x);
try
{
![](https://www.cnblogs.com/Images/dot.gif)
}
finally
{
System.Threading.Monitor.Exit(x);
}
对于任何一个对象来说,他在内存中的第一部分放置的是所有方法的地址,第二部分放着一个索引,他指向CLR中的SyncBlock Cache区域中的一个SyncBlock.什么意思呢?就是说,当你执行Monitor.Enter(Object)时,如果object的索引值为负数,就从SyncBlock Cache中选区一个SyncBlock,将其地址放在object的索引中。这样就完成了以object为标志的锁定,其他的线程想再次进行Monitor.Enter(object)操作,将获得object为正数的索引,然后就等待。直到索引变为负数,即线程使用Monitor.Exit(object)将索引变为负数
在模仿中成长,在创新中成功