zoukankan      html  css  js  c++  java
  • C#多线程的用法4-线程间的协作lock快捷方式

    线程间协作还可通过lock(加锁)方式进行,lock属于C#的Monitor语法糖(Monitor后续讲解)。使用简单快捷,如下:

    /// <summary>
            /// 多线程协作-lock快捷方式
            /// 成功解决多线程对单一资源的共享
            /// </summary>
            private static void MultiThreadSynergicWithLock()
            {
                int[] array = new int[3];
    
                Thread producer = new Thread(() =>
                {
                    int count = 0;
                    Random random = new Random();
                    while (true)
                    {
                        if (10 == count)
                            break;
    
                        lock (array)
                        {
                            array[0] = random.Next(10);
                            array[1] = random.Next(10);
                            array[2] = random.Next(10);
                            count++;
                            Console.WriteLine(String.Format("{0} work count:{1}。{2}-{3}-{4}", Thread.CurrentThread.Name, count, array[0], array[1], array[2]));
                        }
                        Thread.Sleep(100);
                    }
                })
                {
                    Name = "producer"
                };
                Thread customer = new Thread(() =>
                {
                    //Console.WriteLine(String.Format("{0} start work", Thread.CurrentThread.Name));
                    int count = 0;
                    while (true)
                    {
                        if (10 == count)
                            break;
                        lock (array)
                        {
                            count++;
                            Console.WriteLine(String.Format("{0} work count:{1}。{2}-{3}-{4}", Thread.CurrentThread.Name, count, array[0], array[1], array[2]));
                            array[0] = 0;
                            array[1] = 0;
                            array[2] = 0;
                        }
                        Thread.Sleep(10);
                    }
                })
                {
                    Name = "customer"
                };
    
                producer.Start();
                customer.Start();
            }
    

    说明:

    1、通过lock成功解决了多个线程对同一资源的共享使用问题,确保一个线程在lock到资源后,另外需要资源的线程只能处于等待状态。

    2、lock并不能解决线程间顺序执行的问题(线程顺序执行是指:要求线程A,B满足,A先执行,B再执行,A又执行,B再次执行这种交替模式)

  • 相关阅读:
    mysql启动报错:Another MySQL daemon already running with the same unix socket.
    DRBD编译安装中出现的问题及解决小结
    DRBD+Heartbeat+Mysql高可用环境部署
    LVS三种包转发模型调度算法
    nagios环境部署(rhel6.5)
    reorder-list
    二叉树的前序遍历(不用递归)
    最大正方形
    名字的漂亮度
    计算字符个数
  • 原文地址:https://www.cnblogs.com/dw039/p/7398729.html
Copyright © 2011-2022 走看看