zoukankan      html  css  js  c++  java
  • 1.10 使用C#中的lock关键字

    • 本代码描述如何确保当前一个线程使用某些资源时,同时其他线程无法使用该资源。
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace ConsoleApplication3
    {
     class Program
        {
            static void Main(string[] args)
            {
                #region 1.10
                var c = new Counter();
                var t1 = new Thread(() => Class1_10.TestCounter(c));
                var t2 = new Thread(() => Class1_10.TestCounter(c));
                var t3 = new Thread(() => Class1_10.TestCounter(c));
                t1.Start();
                t2.Start();
                t3.Start();
                t1.Join();
                t2.Join();
                t3.Join();
                Console.WriteLine("有问题的 counter类");
                Console.WriteLine("Total count:{0}",c.Count);//一个循环周期内先增1然后在减1,原则上最终结果是0,实际上可能是0,但是更多的是其他值(不确定)。原因:Counter是线程不安全的。
                Console.WriteLine("-----");
    
                Console.WriteLine("正确的 counter类");
    
                var c1 = new CounterWithLock();
                var tt1 = new Thread(() => Class1_10.TestCounter(c1));
                var tt2 = new Thread(() => Class1_10.TestCounter(c1));
                var tt3 = new Thread(() => Class1_10.TestCounter(c1));
                tt1.Start();
                tt2.Start();
                tt3.Start();
                tt1.Join();
                tt2.Join();
                tt3.Join();
                Console.WriteLine("Total count:{0}", c1.Count);
    
                #endregion
    }
        public class Class1_10
        {
            public static void TestCounter(CounterBase c)
            {
                for (int i = 0; i < 10000; i++)
                {
                    c.Increment();//增量
                    c.Decrement();//减量
                }
            }
        }
        public class Counter : CounterBase
        {
            public int Count { get; private set; }
            //递增
            public override void Increment()
            {
                Count++;
            }
            //递减
            public override void Decrement()
            {
                Count--;
            }
        }
        public class CounterWithLock : CounterBase
        {
            private readonly object _syncRoot = new object();
            public int Count { get; private set; }
            //递增
            public override void Increment()
            {
                lock (_syncRoot)
                {
                    Count++;
                }
            }
            //递减
            public override void Decrement()
            {
                lock (_syncRoot)
                {
                    Count--;
                }
            }
        }
        public abstract class CounterBase
        {
            public abstract void Increment();
            public abstract void Decrement();
    
        }
    }
    
    
    
  • 相关阅读:
    解决WampServer窗口界面乱码问题
    PHP 中空字符串介绍0、null、empty和false之间的关系
    位(bit)、字节(byte)、字
    SQL GROUP BY 和 ORDER BY 区别
    爬虫安装相关软件
    nginx自动切割日志脚本
    tengine日志切割-配置分钟级别日志自动切割
    flutter进行自动编译操作步骤
    03-字符编码-读写模式-课堂笔记
    04-函数-课堂笔记
  • 原文地址:https://www.cnblogs.com/anjun-xy/p/11746857.html
Copyright © 2011-2022 走看看