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