藉助Interlocked 類不用阻塞執行緒即可避免競爭條件——執行基本的原子操作
阿新 • • 發佈:2020-09-17
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類,我們無需鎖定即可得到正確的結果。