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随机执行, 每次运行都可能看到不同的先后顺序。

  • 相关阅读:
    springMVC实现表单上传文件,MultipartResolver介绍及配置
    利用 java.util.Timer来写一个定时器
    集合泛型的不变性,而数组具有协变性,注意赋值容易导致的出错
    Python
    GenericServlet
    ServletRequest
    ServletConfig与ServletContext
    Servlet配置及生命周期
    使用jQuery实现Ajax
    XMLHttpRequest实现Ajax &数据格式JSON
  • 原文地址:https://www.cnblogs.com/whtydn/p/10283966.html
Copyright © 2011-2022 走看看