C#线程中LOCK的意义

学习心得,为的是让新人能理解,高手直接绕~

lock 确保当一个线程位于代码的临界区时,另一个线程不进入临界区。如果其他线程试图进入锁定的代码,则它将一直等待(即被阻止),直到该对象被释放。

引用一句看到的资料里比较流行的话“前面说过,每个线程都有自己的资源,但是代码区是共享的,即每个线程都可以执行相同的函数。这可能带来的问题就是几个线程同时执行一个函数,导致数据的混乱,产生不可预料的结果,因此我们必须避免这种情况的发生。”

建一个控制台应用程序

首先引用这个.....

using System.Threading;

    class ThreadInterrupt
    {
        static void Main()
        {
            test tt = new test();
            ///写这么多个为的是让环境更加容易创造出氛围来,线程多起来,出问题的可能性就大
            new Thread(new ThreadStart(tt.test1)).Start();
            new Thread(new ThreadStart(tt.test1)).Start();
            new Thread(new ThreadStart(tt.test1)).Start();
            new Thread(new ThreadStart(tt.test1)).Start();
            new Thread(new ThreadStart(tt.test1)).Start();
            new Thread(new ThreadStart(tt.test1)).Start();
            new Thread(new ThreadStart(tt.test1)).Start();
            new Thread(new ThreadStart(tt.test1)).Start();
            new Thread(new ThreadStart(tt.test1)).Start();
            new Thread(new ThreadStart(tt.test1)).Start();
            new Thread(new ThreadStart(tt.test1)).Start();
            new Thread(new ThreadStart(tt.test1)).Start();
            new Thread(new ThreadStart(tt.test1)).Start();
            new Thread(new ThreadStart(tt.test1)).Start();
            new Thread(new ThreadStart(tt.test1)).Start();
            new Thread(new ThreadStart(tt.test1)).Start();
            new Thread(new ThreadStart(tt.test1)).Start();
            new Thread(new ThreadStart(tt.test1)).Start();
            new Thread(new ThreadStart(tt.test1)).Start();
            new Thread(new ThreadStart(tt.test1)).Start();
            new Thread(new ThreadStart(tt.test1)).Start();
            new Thread(new ThreadStart(tt.test1)).Start();
            new Thread(new ThreadStart(tt.test1)).Start();
            new Thread(new ThreadStart(tt.test1)).Start();
            new Thread(new ThreadStart(tt.test1)).Start();
            new Thread(new ThreadStart(tt.test1)).Start();
            new Thread(new ThreadStart(tt.test1)).Start();
            new Thread(new ThreadStart(tt.test1)).Start();


            
        }
        class test
        {
            private int  a;
            private object b;
            public test()
            {
                a = 8;
                b = new object();
            }

            public void test1()
            {


                //在该位置加lock(this){
          
                ///没有lock的情况下,所有线程都会实时进入(线程是无序的)
                    Console.WriteLine("the thread:{0} 进入 ...", Thread.CurrentThread.GetHashCode());
                /////然后每个线程都会去判断a的值
                    if (a == 0)
                    {
                        Console.WriteLine("a={0},b={1},当前进程{2}", a, b, Thread.CurrentThread.GetHashCode());
                        return;
                    }
                ///到此,如果线程哈希值不是4,则休眠一秒钟,为的是让晚于线程4但是已经判断a!=0的线程再次停留,给线程4充分的事件去把a置为0
                    if (Thread.CurrentThread.GetHashCode() != 4)
                    {
                        Thread.Sleep(1000);
                    }
                /////用当前线程的哈希值除a,为的是如果a为0的话能出现异常,当然可以随便写 110/a,907867869/a都可以
                    b = (Thread.CurrentThread.GetHashCode() / a).ToString();
                ///每个线程进入时对a做一些改变,无关紧要的
                    a -= Thread.CurrentThread.GetHashCode();
                    ///如果线程哈希值是4,则将a置为0。
                    if (Thread.CurrentThread.GetHashCode() == 4)
                    {
                        a = 0;
                    }

                    Console.WriteLine("a={0},b={1},当前进程{2}", a, b, Thread.CurrentThread.GetHashCode());
                
                //lock的 "}"
            }
         
        }

    }

 

转载于:https://www.cnblogs.com/MLGB/p/3197956.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值