返回目錄
在System.Threading.Tasks命名空間下,使用ReaderWriterLockSlim對象來實現多線程並發時的鎖管理,它比lock來說,性能更好,也並合理,我們都知道lock可以對代碼塊進行鎖定,當多線程共同訪問代碼時,只能有一個線程去訪問它,其它線程被阻塞,這對於寫操作是必須的,但對於讀操作來說,就有些浪費資源了,因為我們的讀操作應該是共享的,多個線程可以現時去讀它,這就引出了ReaderWriterLockSlim對象,用它來實現共享鎖和互斥鎖!
聲明一個讀寫鎖
private static ReaderWriterLockSlim rwLock = new ReaderWriterLockSlim();
當一個線程使用共享鎖時,其它線程同樣了可以訪問這個資源,共用這個鎖對象
rwLock.EnterReadLock(); Console.WriteLine(DateTime.Now.ToLongTimeString() + "線程{0}讀到了數據", Thread.CurrentThread.ManagedThreadId); Thread.Sleep(10000); rwLock.ExitReadLock();
當一個線程使用互斥鎖時,其它線程將被阻塞,直到這個線程釋放鎖(ExitWriteLock)為止
rwLock.EnterWriteLock(); Console.WriteLine(DateTime.Now.ToLongTimeString() + "線程{0}寫了數據{1}", Thread.CurrentThread.ManagedThreadId, res); Thread.Sleep(10000); rwLock.ExitWriteLock();
我們在測試時,可以模式多個並發的線程,去調用同一個加鎖的代碼,然後看一個它們執行的時間即可
//多線程的並行 Parallel.Invoke(() => { TestReadWrite("1"); }, () => { TestReadWrite("2"); }, () => { TestReadWrite("3"); });
執行的結果
我們可以看到,共享鎖在被訪問時,幾個線程是同時的;而互斥鎖在使用時,則出現了線程之間的等待(阻塞)!
感謝各位的閱讀!
返回目錄