在衆所周知的Joseph Albahari's article on Threading中,多線程使用的所有類變量被聲明爲static
fields =>所有線程都可以訪問相同的變量。這需要通過lock()
機制在所有的閱讀/寫作地點配備,並完成工作。在多線程中共享數據 - 是非靜態變量嗎?
我的問題是關於類屬性的實現。我明白,如果我實現(例如)使用static
後備存儲性能Timeout
它是有效的:
class MyClassWithWorkerThread {
private readonly object _locker = new object();
private static int _Timeout = false;
private int Timeout {
get {
lock (_locker) {
return _Timeout;
}
}
set {
lock (_locker) {
_Timeout = value;
}
}
}
}
這將使變量_Timeout
所有的類實例共享。
但在我的情況下,多線程處理是類實例私有的。它始於New()
並以Dispose()
結束。主線程和工作線程都訪問Timeout
屬性(但_Timeout
後備存儲從不在屬性getter/setter之外訪問)。我不希望_Timeout
值在應用程序範圍內。我希望每個類實例都具有唯一的。 我的問題是:我可以安全地從_Timeout
變量中刪除static
以實現此目的嗎?
注意:如果代碼中有任何錯誤,我很抱歉,實際上我使用VB.NET,並使用工具對其進行了轉換。我希望主要問題仍然清楚。
我完全同意使用'lock()'(VB:'SyncLock ... End SyncLock')塊來描述。我實際上是想通過在需要的地方創建'Timeout'的本地副本(通過單個讀取操作)來避免突出顯示的場景,因爲在類方法內部沒有寫入它。我在問題中沒有說清楚,但我理解鎖定概念。但至少其他讀者會從你的詳細答案中受益,所以謝謝。 – miroxlav 2014-11-06 12:43:17
易變的場* *非常原子。顯然按順序執行兩個操作不是原子操作,但是也不是按順序鎖定兩次。 – Voo 2014-11-06 17:26:51
@Voo你是對的,我的句子很不明確:對volatile變量的訪問是原子操作,但是_seems_執行原子操作的操作符不是(比如++)。 – 2014-11-06 18:44:42