Lock的一些理解
首页 > 后端开发   作者: 凌波  2016-9-7 0:32:28  热度:6144°  字号:   评论:
时间: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
版权声明:若无注明,本文皆为“凌波小屋”原创,转载请保留文章出处。

发表吐槽

返回顶部    首页    大事记   动态    捐赠支持    后花园   
版权所有:Copyright ©2016 凌波小屋 All rights All rights reserved    站长: 凌波       程序:.Net Mvc   鄂ICP备 15003636号-1