程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> 異步與並行~ReaderWriterLockSlim實現的共享鎖和互斥鎖,readerwriterlockslim

異步與並行~ReaderWriterLockSlim實現的共享鎖和互斥鎖,readerwriterlockslim

編輯:關於.NET

異步與並行~ReaderWriterLockSlim實現的共享鎖和互斥鎖,readerwriterlockslim


返回目錄

在System.Threading.Tasks命名空間下,使用ReaderWriterLockSlim對象來實現多線程並發時的鎖管理,它比lock來說,性能更好,也並合理,我們都知道lock可以對代碼塊進行鎖定,當多線程共同訪問代碼時,只能有一個線程去訪問它,其它線程被阻塞,這對於寫操作是必須的,但對於讀操作來說,就有些浪費資源了,因為我們的讀操作應該是共享的,多個線程可以現時去讀它,這就引出了ReaderWriterLockSlim對象,用它來實現共享鎖和互斥鎖!

聲明一個讀寫鎖

 private static ReaderWriterLockSlim rwLock = new ReaderWriterLockSlim();

EnterReadLock和ExitReadLock-共享鎖

當一個線程使用共享鎖時,其它線程同樣了可以訪問這個資源,共用這個鎖對象

  rwLock.EnterReadLock();
  Console.WriteLine(DateTime.Now.ToLongTimeString() + "線程{0}讀到了數據", Thread.CurrentThread.ManagedThreadId);
  Thread.Sleep(10000);
  rwLock.ExitReadLock();

EnterWriteLock和ExitWriteLock-互斥鎖

當一個線程使用互斥鎖時,其它線程將被阻塞,直到這個線程釋放鎖(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");
            });

執行的結果

我們可以看到,共享鎖在被訪問時,幾個線程是同時的;而互斥鎖在使用時,則出現了線程之間的等待(阻塞)!

感謝各位的閱讀!

返回目錄

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved