• .NET中的lock(C#版本)


    .NET中的lock初探(C#版本)
      lock是什么.
     1     public class ThreadTest
     2     {
     3         private int i = 0;
     4         public void Test()
     5         {
     6             Thread t1 = new Thread(Thread1);
     7             Thread t2 = new Thread(Thread2);
     8             t1.Start();
     9             t2.Start();
    10         }
    11         public void Thread1()
    12         {
    13             lock (this)
    14             {
    15                 Console.WriteLine(this.i);
    16                 Thread.Sleep(1000);
    17                 Console.WriteLine(this.i);
    18             }
    19         }
    20         public void Thread2()
    21         {
    22             Thread.Sleep(500);
    23             this.i = 1;
    24             Console.WriteLine("Change the value in locking");
    25         }
    26     }
    27     public class ThreadTest2
    28     {
    29         private int i = 0;
    30         public void Test()
    31         {
    32             Thread t1 = new Thread(Thread1);
    33             Thread t2 = new Thread(Thread2);
    34             t1.Start();
    35             t2.Start();
    36         }
    37         public void Thread1()
    38         {
    39             lock (this)
    40             {
    41                 Console.WriteLine(this.i);
    42                 Thread.Sleep(1000);
    43                 Console.WriteLine(this.i);
    44             }
    45         }
    46         public void Thread2()
    47         {
    48             lock (this)
    49             {
    50                 Thread.Sleep(500);
    51                 this.i = 1;
    52                 Console.WriteLine("Can't change the value in locking");
    53             }
    54         }
    55     }

          两段程序有什么区别吗?看看吧,ThreadTest2.Thread2()中多了一个lock(this)却产生了不同的结果

          本想在案例一中lock住this对象,让其他的线程不能操作,可是事情不是像我们想象的那样lock(this)是lock this的意思.this中的属性依然能够被别的线程改变.那我们lock住的是什么?是代码段,是lock后面大括号中代码段,这段代码让多个人执行不不被允许的.那返回头来在看lock(this),this是什么意思呢?可以说this知识这段代码域的标志,看看案例二中Thread2.Thread2就明白了,Thread2中的lock需要等到Thread1种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)将索引变为负数。

           如果明白了Monitor.Enter的原理,lock当然不再话下.当然lock后括号里面的值不是说把整个对象锁住,而是对他的一个值进行了修改,使别的lock不能锁住他,这才是lock(object)的真面目.

           但在实际使用中Monitor还是不推荐,还是lock好的,Monitor需要加上很多try catch才能保证安全性,但lock却帮我们做了,而且lock看起来更优雅.

           在静态方法中如何使用lock呢,由于我们没有this可用,所以我们使用typeof(this)好了,Type也有相应的方法地址和索引,所以他也是可以来当作lock的标志的.

           但微软不提倡是用public的object或者typeof()或者字符串这样的标志就是因为,如果你的public object在其他的线程中被null并被垃圾收集了,将发生不可预期的错误.
    转:http://blog.whjs.gov.cn/user1/burningsnow/archives/2007/20072102051.html

  • 相关阅读:
    Python高级特性-迭代
    Python列表生成式测试
    Python函数基础学习(定义、函数参数、递归函数)
    Html介绍,认识head标签
    Html介绍,认识html文件基本结构
    Html介绍,标签的语法
    Html介绍,认识html标签
    Html介绍,了解html与css关系
    Html介绍,如何用代码展示我制作的第一个网页?
    C++走向远洋——38(用对象数组操作长方柱类)
  • 原文地址:https://www.cnblogs.com/xzp/p/1064303.html
Copyright © 2020-2023  润新知