文章出處

返回目錄

在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");
            });

執行的結果

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

感謝各位的閱讀!

返回目錄


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()