zoukankan      html  css  js  c++  java
  • C# Thread Lock 笔记

    多线程, 当使用共有变量时, 保持计算结果正确很重要:

    看下面的例子:

    private static int count = 10;
            //private static object objlock = new object();
    
            public static void Main(string[] args)
            {
                try
                {
                    for (int i = 0; i < 20; i++)
                    {
                        Thread t1 = new Thread(new ThreadStart(WriteNumber));
                        t1.Name = "Name-" + i.ToString();
                        t1.Start();
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
    
                Console.ReadLine();
            }
    
            public static void WriteNumber()
            {
                //lock (objlock)
                //{
                    count--;
                    Thread.Sleep(1000);
                    Console.WriteLine("Name:" + Thread.CurrentThread.Name + " count:" + count.ToString());
                //}
            }

    结果这样,全错了。

    加上lock之后, 代码修改为这样

    private static int count = 10;
            private static object objlock = new object();
    
            public static void Main(string[] args)
            {
                try
                {
                    for (int i = 0; i < 20; i++)
                    {
                        Thread t1 = new Thread(new ThreadStart(WriteNumber));
                        t1.Name = "Name-" + i.ToString();
                        t1.Start();
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
    
                Console.ReadLine();
            }
    
            public static void WriteNumber()
            {
                lock (objlock)
                {
                    count--;
                    Thread.Sleep(1000);
                    Console.WriteLine("Name:" + Thread.CurrentThread.Name + " count:" + count.ToString());
                }
            }

    运行结果是这样:

    注意:private static object objlock = new object();  //定义这个变量的位置,

    各线程运行先后, 由CPU随机执行, 每次运行都可能看到不同的先后顺序。

  • 相关阅读:
    springboot整合Swagger2
    FastJson会把哪些字符串解析为null
    BitMap再再体验之布隆过滤器
    如何利用windows自带的画图工具拼接图片
    BitMap再体验之排序
    BitMap 初体验
    Chrome 隐藏最常访问的网站
    idea同一个项目不同端口启动
    ubuntu16搭建harbor镜像库
    virtualbox硬盘扩容
  • 原文地址:https://www.cnblogs.com/whtydn/p/10283966.html
Copyright © 2011-2022 走看看