線程安全:如果你的代碼所在的進程中有多個線程在同時運行,而這些線程可能會同時運行這段代碼。如果每次運行結果和單線程運行的結果是一樣的,而且其他的變數的值也和預期的是一樣的,就是線程安全的。早期的時候,微軟的集合類實現線程安全是通過最基本的加鎖實現的。我們可以註意到在system.collection ...
線程安全:
如果你的代碼所在的進程中有多個線程在同時運行,而這些線程可能會同時運行這段代碼。如果每次運行結果和單線程運行的結果是一樣的,而且其他的變數的值也和預期的是一樣的,就是線程安全的。
早期的時候,微軟的集合類實現線程安全是通過最基本的加鎖實現的。我們可以註意到在system.collections 程式集中有兩個提供了加鎖機制的方法和欄位,分別是_syncRoot 欄位和Synchronized 方法。但是加鎖來實現同步是粗粒度的,集合通過Synchronized 屬性提供某種線程安全性。該包裝的工作原理是: 對每個添加或刪除操作,鎖定整個集合。因此,每個嘗試訪問集合的線程必須一直等待,知道輪到它來獲取鎖。對於大型集合而言,將會導致性能顯著降低
.net framework 4提供了細粒度鎖定和無鎖機制,新增的system.collections.concurrent 程式集中的線程安全集合就是使用輕量同步機制,如SpinLock, SpinWait, SemaphoreSlim和CountdownEvent。
輕量級同步原語只能用在一個進程內。而相應的那些重量級版本支持跨進程的同步。
輕量級同步更節省CPU開銷以及避免了上下文切換
ConcurrentQueue的線程安全實現:
ConcurrentDictionary的線程安全實現:
ConcurretnStack的線程安全實現:
生產者消費者問題是典型的多線程應用問題:
簡單的表述這個問題就是:有一個或多個線程(生產者線程)產生一些數據,同時,還有一個或者多個線程(消費者線程)要取出這些數據並執行一些相應的工作
微軟的.net framework4提供了專門解決這類問題的併發類:BlockingCollection和IProducerConsumerCollection
BlockingCollection集合是一個擁有阻塞功能的集合,它就 是完成了經典生產者消費者的演算法功能。它沒有實現底層的存儲結構,而是使用了實現IProducerConsumerCollection介面的幾個集合 作為底層的數據結構,例如ConcurrentBag, ConcurrentStack或者是ConcurrentQueue。你可以在構造BlockingCollection實例的時候傳入這個參數,如果 不指定的話,則預設使用ConcurrentQueue作為存儲結構。
不得不說,現在的FCL 很完善,記得自己之前看過一篇博客抱怨.net 的線程安全做的沒有java的好,當時我看完其實也有點惋惜,微軟的技術人才那麼多,怎麼會做不好。看看現在的FCL還是很不錯。
線程安全集合
https://msdn.microsoft.com/zh-cn/library/ms228964(v=vs.110).aspx
線程安全集合概述
https://msdn.microsoft.com/zh-cn/library/dd997305%28v=vs.110%29.aspx?lc=2052
C# 4.0之線程安全篇
http://www.cnblogs.com/chengxiaohui/articles/5672768.html