zoukankan      html  css  js  c++  java
  • 多线程之同时更改数据问题--启用lock

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    
    namespace ThreadDemo
    {
        class LockDemo
        {
    
            abstract class CounterBase
            {
                public abstract void Increment();
    
                public abstract void Decrement();
            }
            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--;
                    }
                }
            }
            class Counter : CounterBase
            {
                public int Count { get; private set; }
    
                public override void Increment()
                {
                    Count++;
                }
    
                public override void Decrement()
                {
                    Count--;
                }
            }
            static void TestCounter(CounterBase c)
            {
                for (int i = 0; i < 100000; i++)
                {
                    c.Increment();
                   // c.Decrement();
                }
            }
            static void Main(string[] args)
            {
                Console.WriteLine("Incorrect counter");
    
                var c = new Counter();
    
                var t1 = new Thread(() => TestCounter(c));
                var t2 = new Thread(() => TestCounter(c));
                var t3 = new Thread(() => TestCounter(c));
                t1.Start();
                t2.Start();
                t3.Start();
                t1.Join();
                t2.Join();
                t3.Join();
    
                Console.WriteLine("Total count: {0}", c.Count);
                Console.WriteLine("--------------------------");
    
                Console.WriteLine("Correct counter");
    
                var c1 = new CounterWithLock();
    
                t1 = new Thread(() => TestCounter(c1));
                t2 = new Thread(() => TestCounter(c1));
                t3 = new Thread(() => TestCounter(c1));
                t1.Start();
                t2.Start();
                t3.Start();
                t1.Join();
                t2.Join();
                t3.Join();
                Console.WriteLine("Total count: {0}", c1.Count);
                Console.ReadKey();
            }
    
        }
    }

    第一次运行结果:

     第二次运行结果:

     可以看到,开了3个线程,对同一个变量进行++操作,如果没有lock,则结果不可预知;lock之后,则结果正常。

  • 相关阅读:
    解决方案:ubuntu无法获得锁,无法管理目录
    ACM经典题目——校门外的树
    【动态规划】01背包问题(通俗易懂,超基础讲解)
    从编程实现角度学习 Faster R-CNN(附极简实现)
    git clone 时,出现‘fatal: HTTP request failed‘
    git clone出现 fatal: unable to access 'https://github.com/...'的解决办法(亲测有效)
    Qt类库的模块
    java 中的 池
    sql 语句
    httpClient 发送http请求
  • 原文地址:https://www.cnblogs.com/25miao/p/11481845.html
Copyright © 2011-2022 走看看