今天主要介紹下C#的兩種鎖:互斥鎖(lock)和讀寫鎖(ReadWriteLock)
互斥鎖(lock)
lock 關鍵字將語句塊標記為臨界區,方法是獲取給定對象的互斥鎖,執行語句,然後釋放該鎖。當任何一個線程獲取到鎖後,其他線程如果需要使用該臨界區內代碼,則必須等待前一個線程使用完畢後釋放鎖。
代碼示例:
Object thisLock = new Object(); lock (thisLock) { // 臨界區代碼塊 }
ReadWriteLock定義支持單個寫線程和多個讀線程的鎖。該鎖的作用主要是解決並發讀的性能問題,使用該鎖,可以大大提高數據並發訪問的性能,只有在寫時,才會阻塞所有的讀鎖。
示例代碼:
using System.Collections.Generic; using System.Windows; using System.Threading; namespace FYSTest { public partial class MainWindow : Window { Listlist = new List (); private ReaderWriterLock _rwlock = new ReaderWriterLock(); public MainWindow() { InitializeComponent(); Thread ThRead = new Thread(new ThreadStart(Read)); ThRead.IsBackground = true; Thread ThRead2 = new Thread(new ThreadStart(Read)); ThRead2.IsBackground = true; Thread ThWrite = new Thread(new ThreadStart(Write)); ThWrite.IsBackground = true; ThRead.Start(); ThRead2.Start(); ThWrite.Start(); } private void Read() { while (true) { //使用一個 System.Int32 超時值獲取讀線程鎖。 _rwlock.AcquireReaderLock(100); try { if (list.Count > 0) { int result = list[list.Count - 1]; } } finally { //減少鎖計數,釋放鎖 _rwlock.ReleaseReaderLock(); } } } int WriteCount = 0;//寫次數 private void Write() { while (true) { //使用一個 System.Int32 超時值獲取寫線程鎖。 _rwlock.AcquireWriterLock(100); try { list.Add(WriteCount++); } finally { //減少寫線程鎖上的鎖計數,釋放寫鎖 _rwlock.ReleaseWriterLock(); } } } } }