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/smooth_tailor/article/details/52411359?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
————————————————
版权声明:本文为CSDN博主「JosieBook」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_38628970/article/details/104696940

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值