當涉及到多線程共享數據,需要數據同步的時候,就可以考慮使用線程鎖了。本篇體驗線程鎖的各種用法以及線程死鎖。主要包括:
※ 使用lock處理數據同步※ 使用Monitor.Enter和Monitor.Exit處理數據同步※ 使用Mutex處理進程間數據同步※ 使用Semaphore處理數據同步※ 線程死鎖
□ 使用lock處理數據同步
假設有一個類,主要用來計算該類2個字段的商,在計算商的方法之內讓被除數自減,即被除數有可能為零。使用lock語句塊保證每次只有一個線程進入該方法。
class ThreadSafe{static readonly object o = new object();PRivate static int _val1, _val2;public ThreadSafe(int val1, int val2){_val1 = val1;_val2 = val2;}public void Calculate(){lock (o){--_val2;if (_val2 != 0){Console.WriteLine(_val1/_val2);}else{Console.WriteLine("_val2為零");}}}}
○ new object()創建的對象實例,也被稱作同步對象○ 同步對象必須是引用類型○ 同步對象通常是私有的、靜態的
客戶端有一個靜態字段val2被ThreadSafe的2個實例方法共用。
class Program{private static int val2 = 2;static void Main(string[] args){ThreadSafe ts1 = new ThreadSafe(2, val2);ThreadSafe ts2 = new ThreadSafe(2, val2);Thread[] threads = new Thread[2];threads[0] = new Thread(ts1.Calculate);
新聞熱點
疑難解答