线程同步:线程拥有自己的字符串类型锁副本

时间:2014-04-22 10:24:30

标签: c# multithreading

最近我遇到了以下代码:

void CallThisInDifferentThreads(Return return)
{
 var lock =  "lock";
 lock(lock)
    {
        //Do something here.
    }
}

我的第一反应是此代码中的锁定无法正常工作,因为我们正在创建锁并在同一方法中使用它。调用此方法的每个线程都拥有它自己的锁副本,因此不会有同步。

但后来我意识到这应该有效,因为字符串转到字符串池,并且只有一个特定字符串的实例。我不确定我是否正确。

1 个答案:

答案 0 :(得分:5)

锁定字符串 超级错误 。不要这样做。你不能保证其他一些聪明的灵魂也不会锁定琴弦,因为它们因为弦乐实习而有效地“超级”全球化,所以当这成为公认的练习时,轮子就会掉下来。

使用只有一个目的的私有对象锁定...锁定。字符串不符合此描述。

Locking by string. Is this safe/sane?

Is it OK to use a string as a lock object?