2011-11-25 50 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”相同。在大多数情况下,简单地在字符串上进行锁定会导致监视器在使用相同字符串的任何地方等待。它就像是一个互斥锁,用于同一个进程。

所以一定要注意,你不锁定在该参考该字符串是很重要的,你的所有引用锁定到该字符串