.NET中常見的鎖 筆記

Lock、Monitor

lock和Monitor的區別

1、lock的底層本身是Monitor來實現的,所以Monitor可以實現lock的所有功能。
2、Monitor有TryEnter的功能,可以防止出現死鎖的問題,lock沒有。

儘管大部分時間您都希望使用 lock 語句,但 Monitor 類可以在需要時給予額外的控制。例如,您可以使用 TryEnter() 而不是 Enter(),並指定一個限定時間,避免無止境地等待鎖釋放。

Mutex

Mutex 是 Monitor 更重量級的版本,依賴於底層的操作系統,提供跨多個進程同步訪問資源[1], 是針對 Mutex 進行同步的推薦替代方案。

Mutex只能互斥線程間的調用,但是不能互斥本線程的重複調用

Monitor和Lock多用於鎖定被調用端,而Mutex則多用鎖定調用端。

ReaderWriterLockSlim

http://www.cnblogs.com/08shiyan/p/6423532.html

  • 避免使用短生命週期的ReaderWriterLockSlim對象
  • 儘量減少ReaderWriterLockSlim對象的實例

http://blog.csdn.net/shuliuzh/article/details/32130031

 表示用於管理資源訪問的鎖定狀態,可實現多線程讀取或進行獨佔式寫入訪問,可以區分兩種對訪問資源的方式。它允許無限數量的讀取器 (readers) 同時訪問資源,並且限制同時只允許一個寫入器 (writers) 訪問鎖定資源。讀取時線程安全,但修改數據時需要獨佔資源,很好地保護了資源。

使用ReaderWriterLockSlim來保護由多個線程讀取但每次只採用一個線程寫入的資源。
允許多個線程均處於讀取模式,允許一個線程處於寫入模式並獨佔鎖定狀態,同時還允許一個具有讀取權限的線程處於可升級的讀取模式,在此模式下線程無需放棄對資源的讀取權限即可升級爲寫入模式。
ReaderWriterLockSlim 類似於 ReaderWriterLock,只是簡化了遞歸、升級和降級鎖定狀態的規則。 ReaderWriterLockSlim 可避免多種潛在的死鎖情況。 此外,ReaderWriterLockSlim 的性能明顯優於 ReaderWriterLock。 建議在所有新的開發工作中使用 ReaderWriterLockSlim。

Interlocked-原子操作

https://msdn.microsoft.com/zh-cn/library/system.threading.interlocked(v=vs.110).aspx

SpinLock-原子操作

https://msdn.microsoft.com/zh-cn/library/system.threading.spinlock(v=vs.110).aspx

1、自旋鎖本身是一個結構、而不是類,這樣使用過多的鎖時不會造成GC壓力。

2、自旋鎖是以一種循環等待的方式去嘗試獲取鎖,也就是說、在等待期間 會一直佔用CPU、如果等待時間過長會造成CPU浪費,而 Monitor會休眠(Sleep)。

3、自旋鎖的使用準則:讓臨界區儘可能短(時間短)、非阻塞的方式。(因爲等待時間過長會造成CPU浪費)

4、由於自旋鎖是循環等待的方式、在執行方式上和Monitor的休眠不一樣,自旋鎖的執行速度會更快。而Monitor的休眠方式會造成額外的系統開銷,執行速度反而會降低。

SemaphoreSlim 和 Semaphore

都可以限制同時訪問資源的最大線程數量,而不是像 Monitor 一樣只能限制一個線程。 SemaphoreSlim 比 Semaphore 更輕量,但僅限於單個進程。如果可能,您最好使用 SemaphoreSlim 而不是 Semaphore。

AutoResetEvent、ManualResetEvent 和 ManualResetEventSlim

AutoResetEvent、ManualResetEvent 和 ManualResetEventSlim 將堵塞傳入的線程,直到它們接收到一個信號 (即調用 Set() )。然後等待中的線程將繼續執行。AutoResetEvent 在下一次調用 Set() 之前,將一直阻塞,並只允許一個線程繼續執行。ManualResetEvent 和 ManualResetEventSlim 不會堵塞線程,除非 Reset() 被調用。ManualResetEventSlim 比前兩者更輕量,更值得推薦。

 

並行編程

https://www.jianshu.com/p/c6ba98367f5e

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章