• Lock的用法,为什么要用?


    当多个进程分享数据的时候,对某段程序代码要lock(当对分享数据进行改写的时候)。

    我们先看些这段代码:

    namespace ThreadTest
    {
        class Program
        {
            static bool done;
            static void Main(string[] args)
            {
                new Thread(Go).Start();
                Go();                    
                Console.ReadKey();
            }
            static void Go()
            {
                if (!done)
                {
                    done = true;
                    Console.WriteLine("Done");
                } 
    }
    }
    }

    字段“Done”是两个进程分享的,所以结果输出一个“Done”;但是我们如果把两句程序颠倒一下:

            static void Go()
            {
                if (!done)
                {
                    Console.WriteLine("Done");
                    done = true;
                }
            }

    一个进程还没来得及把"done"设置为true的时候,另一个进程可能已经输出了,这就大大的加大了输出两个Done的可能性。

    所以,我们需要lock,当给共享变量赋值的时候,可以给程序锁住,这样另一个进程就只能等待,直到lock解除。

            static bool done;
            static readonly object locker = new object();
            static void Main(string[] args)
            {
                new Thread(Go).Start();
                Go();                    
                Console.ReadKey();
            }
            static void Go()
            {
                lock(locker)
                {
                    if (!done)
                    {
                        Console.WriteLine("Done");
                        done = true;
                    }
                }
            }
  • 相关阅读:
    Maven 安装配置
    docker 安装 MySQL
    查看CentOS版本方法
    JavaScript定时器的开启关闭
    JavaScript实现延时提示框
    JavaScript获取当前时间
    JavaScript实现数字时钟功能
    JavaScript获取非行间样式
    JavaScript数组的操作
    JavaScript数组和json的区别
  • 原文地址:https://www.cnblogs.com/xiao9426926/p/5983726.html
Copyright © 2020-2023  润新知