2016-12-26 69 views
0

我知道靜態變量或集合在線程中是共享的,最多隻有一個內存地址是爲變量創建的,並且它的狀態在線程中是持久的。靜態列表或變量需要鎖定機制嗎?

靜態詮釋計數= 0

線程1 - >算++

螺紋2 - > diplay計數 - > 1

線3 - > count--

線程1 - >顯示計數 - > 0

我的問題,鎖定機制是必需的靜態集合?下面是靜態收集和鎖定機制。

public static List<ConnectionManager> ServerConnections = new List<ConnectionManager>(); 
lock (Global.ServerConnections) 
{ 
//do something 
} 

回答

0

答案是肯定的。你需要一個鎖,因爲Static!=線程安全。這也適用於您的count變量。

僅僅因爲一個變量是靜態的,並不能保證線程安全。多個線程仍然可以在同一時間訪問它,這會導致併發問題。

默認情況下,沒有線程安全性,它必須設計爲線程安全。

也看看ConcurrentBag<T>

0

當然。如果你只需要線程安全,你可以使用C#併發集合,但是如果你想要一些同步(就像一個線程中的集合上的多個動作被執行而沒有其他線程的影響),你需要鎖定。

其實你也需要照顧你的變量,count++count--不是線程安全的。使用Interlocked或任何其他機制來確保線程安全。

0

它屬於你如何使用集合以及如何安裝它。如果你從不同的線程實例化它,你應該保證只有一個線程安裝它。因爲有更多的線程在惡劣的環境中同時嘗試安裝。在.Net中實現的Lazy類就是爲了這個目的,並且很容易實例化線程安全和懶惰。進一步你需要鎖定你的收藏在任何你想要做的手術中。插入,刪除,迭代等都不是線程安全的。閱讀有關concurrentDictionary等的更多關於線程安全集合的信息。