2011-11-25 49 views
3

我只是好奇,如果有可能使用常量的值作爲鎖,例如:C#和線程 - 如果我使用const會鎖定工作嗎?

private const string counterKey = "Requests_Sec"; 
public static object RequestsPerSecond() 
{ 
    lock (counterKey) 
    { 
     // do something... 
    } 
} 

我認爲常量是靜態的,所以我用它在這種情況下,我很好奇,如果恢復到靜態字符串是什麼解決了問題。

編輯:你們中的大多數是在說是問題,而不是常量。要改寫我的問題 - 這將鎖定即可:

private const object counterKey = new object(); 

編輯:我不好 - 你不能有const對象 ...我走離開這總是在對象鎖定_sync = new object();並使其靜態如果需要。

+1

const對象只能有null值。即使你可以聲明它是一個對象,它仍然是實習生池中字符串的一個實例,所以問題會一樣。 – phoog

+0

相關:http://stackoverflow.com/q/6937342/158779 –

回答

4

這是關於鎖定字符串而不是鎖定靜態常量。只有2種類型的變量可以標記爲const,而這些變量是原始值類型和字符串。在第一個你不能鎖定。請注意,由於字符串中介,使字符串爲const或不會在字符串實例方面產生很大差異。

有關這個問題的答案是如何處理字符串的鎖定,請參閱:Using string as a lock to do thread synchronization

基本上,它是不是安全鎖在一根繩子上。

+2

只要值爲null,引用類型也可以是const。當然,你不能鎖定null。 – phoog

3

答案可能是:鎖是有效的。但我必須說:不,不要這樣做。即使它有效,也會讓其他人感到困惑。使用普通的對象鎖好得多。

1

常量部分拋出你的主要問題。

任何字符串都映射到它在內存中的單個表示形式......在一個地方聲明的「a」與其他地方聲明的「a」相同。在大多數情況下,簡單地在字符串上進行鎖定會導致監視器在使用相同字符串的任何地方等待。它就像是一個互斥鎖,用於同一個進程。

所以一定要注意,你不鎖定在該參考該字符串是很重要的,你的所有引用鎖定到該字符串