1. 程式人生 > 實用技巧 >藉助Interlocked 類不用阻塞執行緒即可避免競爭條件——執行基本的原子操作

藉助Interlocked 類不用阻塞執行緒即可避免競爭條件——執行基本的原子操作

1.我們先定義一個抽象類,定義兩個抽象方法用於實現加減,如下:

2.然後新建兩個類繼承抽象類並實現抽象方法:

1>定義的類實現的方法使用lock鎖定一次只能有一個執行緒操作,其它執行緒則等待。

2>定義的類實線的方法使用Interlocked如下:

3.最後在Main方法中編寫如下程式碼:

 static void Main(string[] args)
        {
            var c = new Counter();
            var t1 = new Thread(() => TestCounter1(c));
            var t2 = new Thread(() => TestCounter1(c));
            var t3 = new Thread(() => TestCounter1(c));
            t1.Start();
            t2.Start();
            t3.Start();
            t1.Join();
            t2.Join();
            t3.Join();
            Console.WriteLine("total1 count{0}", c.Count);

            var c1 = new CounterNolock();
            var m1 = new Thread(() => TestCounter(c1));
            var m2 = new Thread(() => TestCounter(c1));
            var m3 = new Thread(() => TestCounter(c1));
            m1.Start();
            m2.Start();
            m3.Start();
            m1.Join();
            m2.Join();
            m3.Join();
            Console.WriteLine("total2 count{0}", c1.Count);
            Console.ReadLine();

        }
        static void TestCounter(CounterBase c)
        {
            for (int i = 0; i < 10000000; i++)
            {
                c.Increment();
                c.Decremet();

            }
        }
        static void TestCounter1(CounterBase c)
        {
            for (int i = 0; i < 1000000; i++)
            {
                c.Increment();
                c.Decremet();

            }
        }

  當程式啟動時會建立三個執行緒,由於Counter不是執行緒安全的,會有相互競爭的情況,所以計算的結果值不是確定的。而CounterNoLock藉助Interlocked類,我們無需鎖定即可得到正確的結果。