zoukankan      html  css  js  c++  java
  • C#lock语句用法(lock到底有什么用?)

    lock,顾名思义,锁。
    lock的用法说起来容易,就是锁定当前正在执行的内容。真正理解却不容易。
    于是,我做了下面的测试,对比使用lock和不使用lock的情况,才真正理解了。


    在下面的代码中,线程1,2同时调用函数write(),执行函数里面的内容。

    使用线程锁lock的时候,不会出现两个线程抢占执行函数的情况;
    不使用线程锁lock的时候,出现两个线程锁抢占执行函数的情景。

    所以在有很多个线程(Thread 对象)同时运行,要执行同一个操作(调用一个函数)的时候,使用lock把代码锁定,就告诉那很多个线程:本函数的本内容只能在同一时间被一个线程调用!

    也就避免了第二个代码里竞争运行的结果。

    另外,lock一般出现在while(true)循环里。在有线程要调用的函数里面出现。

    使用lock的情况如下:

    class Program
        {
            static Object locker = new object();        //创建锁对象
            public static int money = 0;                //捐款总额
    
            static void Main(string[] args)
            {
                Thread th1 = new Thread(write);         //第一个线程
                Thread th2 = new Thread(write);         //第二个线程
                th1.Start();                            //同时开启,并行进行
                th2.Start();
            }
    
            private static void write()
            {
                while (true)
                {
                    lock (locker)
                    {
                        money = money + 100;    
                        Console.WriteLine("前面的人正在投币,后面的人请等待...");
                        Thread.Sleep(3000);
                        Console.WriteLine("目前共募捐:"+ money+"元\n");
                    }
                }
            }
        }

    输出的结果:非常规整,就像只有一个线程运行的结果一样。

      

    不使用lock的情况(把lock注释掉了):th1和th2竞争占用要执行的同一个资源。

     class Program
        {
            static Object locker = new object();        //创建锁对象
            public static int money = 0;                //捐款总额
    
            static void Main(string[] args)
            {
                Thread th1 = new Thread(write);         //第一个线程
                Thread th2 = new Thread(write);         //第二个线程
                th1.Start();                            //同时开启,并行进行
                th2.Start();
            }
    
            private static void write()
            {
                while (true)
                {
                    //lock (locker)
                    //{
                        money = money + 100;    
                        Console.WriteLine("前面的人正在投币,后面的人请等待...");
                        Thread.Sleep(3000);
                        Console.WriteLine("目前共募捐:"+ money+"元\n");
                    //}
                }
            }
        }
    

    结果出现两个线程同时抢占函数,同时使用资源的情况。


    转原文链接:https://blog.csdn.net/qq_38628970/article/details/104696940?spm=1035.2023.3001.6557&utm_medium=distribute.pc_relevant_bbs_down.none-task-blog-2~default~OPENSEARCH~default-6.nonecase&depth_1-utm_source=distribute.pc_relevant_bbs_down.none-task-blog-2~default~OPENSEARCH~default-6.nonecase

  • 相关阅读:
    悲悯心洞悉真相
    查看逍遥模拟器端口号
    delphi中Tstringlist分割字符串的用法
    delphi中httpencode使用注意事项
    DELPHI常用类型及定义单元
    左旋转字符串
    链表中倒数第k个节点
    二叉树镜像
    用两个栈实现队列
    从尾到头打印链表
  • 原文地址:https://www.cnblogs.com/shiyi2014/p/15741073.html
Copyright © 2011-2022 走看看