Lock的一些理解
时间:2016-9-7 0:32:28
热度:6144°
评论:
无意间看到一个关于线程安全的笔试题,有考察到lock死锁的问题,自己也思索了半天,没想出来出现死锁的那个场景,于是再去补补lock的概念,去园子里面瞟了几眼:
lock语句根本使用的就是Monitor.Enter和Monitor.Exit,也就是说lock(this)时执行Monitor.Enter(this),大括号结束时执行Monitor.Exit(this).他的意义在于什么呢,对于任何一个对象来说,他在内存中的第一部分放置的是所有方法的地址,第二部分放着一个索引,他指向CLR中的SyncBlock Cache区域中的一个SyncBlock.什么意思呢?就是说,当你执行Monitor.Enter(Object)时,如果object的索引值为负数,就从SyncBlock Cache中选区一个SyncBlock,将其地址放在object的索引中。这样就完成了以object为标志的锁定,其他的线程想再次进行Monitor.Enter(object)操作,将获得object为正数的索引,然后就等待。直到索引变为负数,即线程使用Monitor.Exit(object)将索引变为负数。
是这么个回事,二话不说,打开vs,也尝试的敲了一遍
class Test { public static object A = new object(); public static object B = new object(); public void Ce(object obj) { lock (A) { Thread.Sleep(500); Console.WriteLine("我把A锁了"); lock (B) { Console.WriteLine("我把B锁了"); } } } static void Main(string[] args) { Test t = new Test(); ThreadPool.QueueUserWorkItem(t.Ce); lock (B) { Thread.Sleep(500); Console.WriteLine("我把B锁了"); lock (A) { Console.WriteLine("我把A锁了"); } } } }
捐赠支持:如果觉得这篇文章对您有帮助,请“扫一扫”鼓励作者!
相关文章
本文作者: 凌波
文章标题: Lock的一些理解
本文地址:http://www.lingbohome.com/Article/Post/26
版权声明:若无注明,本文皆为“凌波小屋”原创,转载请保留文章出处。
本文地址:http://www.lingbohome.com/Article/Post/26
版权声明:若无注明,本文皆为“凌波小屋”原创,转载请保留文章出处。
发表吐槽