0

我有一個具有受保護方法的抽象類。我在這個方法中使用字典。這個類有2個實現。這兩個類爲某些操作調用此受保護的方法。如果兩個實現都在不同的線程中運行,那麼受保護方法中的字典是否線程安全?受保護方法內的字典是否安全?

受保護的方法如下

protected Dictionary<string, string> GenerateParameterFromQueue() 
    { 
     Dictionary<string, string> parameters; 
     string queueInput = this._Queue.QueueInput; 
     string[] inputArray = Regex.Split(queueInput,Constants.KEY_DELIMITER); 

     parameters = inputArray.ToDictionary(s => s.Split(Convert.ToChar(Constants.KEY_EQUALITY))[0], s => s.Split(Convert.ToChar(Constants.KEY_EQUALITY))[1]); 

     return parameters; 
    } 

回答

2

是的,由於該方法中的字典是在該方法本身內的每個線程創建的,因此您使用Dictionary是線程安全的。當然,這並不意味着在方法返回之後在方法外部使用它自動是線程安全的。

只有當兩個線程訪問/更改單個Dictionary時,您纔會遇到問題。它與被保護的方法無關。

我在這個方法中擔心的是this._Queue變量,因爲它是在多個線程之間共享的,而您沒有鎖定它,所以您需要確保它本身是線程安全的。

+0

感謝澄清約阿希姆。關於這個._Queue,它不是一個靜態變量。我設置它在其他方法如下public void ProcessQueue(Queue queue){this._Queue = queue;}我想這將創建每個線程的新_Queue對象,因此它是安全的。如果我錯了,請糾正我。 –

+1

這很大程度上取決於系統設計中未在您的問題中顯示的部分。多個線程可以同時在同一個對象中運行嗎?如果是這樣,不一定是線程安全的,因爲線程在設計時會使用相同的_Queue引用。相同的隊列可以傳遞給多個對象嗎?同樣的事情,不一定是線程安全的,因爲多個對象的_Queue變量可能指向相同的隊列。在一個對象實例中保留一個線程,遠離靜態並確保不將共享對象傳遞給多個實例通常會保證您的安全。 –

0

字典是「線程安全的」,但不是因爲它是一個受保護的方法。它是線程安全的,因爲您從頭開始生成字典。

0

protected關鍵字僅意味着該方法僅在包含類型或子類中可見。它不是使它線程安全。正在爲該方法的每個線程調用創建Dictionary,這使得Dictionary線程在此示例中是安全的...

對於線程安全集合,請參見​​類。

我希望這會有所幫助。