Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 线程同步:线程有自己的字符串类型锁副本_C#_Multithreading - Fatal编程技术网

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

C# 线程同步:线程有自己的字符串类型锁副本,c#,multithreading,C#,Multithreading,最近我遇到了如下代码: void CallThisInDifferentThreads(Return return) { var lock = "lock"; lock(lock) { //Do something here. } } 我的第一个反应是,代码中的锁不起作用,因为我们正在创建锁并以相同的方法使用它。调用此方法的每个线程都有自己的锁副本,因此不会进行同步 但后来我意识到这应该是可行的,因为字符串进入字符串池,并且只有一个特定字符串的实例。我不确

最近我遇到了如下代码:

void CallThisInDifferentThreads(Return return)
{
 var lock =  "lock";
 lock(lock)
    {
        //Do something here.
    }
}
我的第一个反应是,代码中的锁不起作用,因为我们正在创建锁并以相同的方法使用它。调用此方法的每个线程都有自己的锁副本,因此不会进行同步


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

锁定字符串是非常糟糕的。不要这样做。你不能保证其他聪明的灵魂也不会锁定弦,因为弦的练习使弦实际上是“超级”全局的,一旦这成为公认的练习,轮子就会掉下来

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


锁定字符串是非常糟糕的。不要这样做。你不能保证其他聪明的灵魂也不会锁定弦,因为弦的练习使弦实际上是“超级”全局的,一旦这成为公认的练习,轮子就会掉下来

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


您需要将锁设置为“静态”,以便每个线程都可以访问它。“因为字符串进入字符串池”-字符串可能会被占用,也可能不会被占用。你的代码不应该依赖于你的字符串被拘留。你需要将锁设置为“静态”,这样每个线程都可以访问它。“因为字符串进入字符串池”-字符串可以被拘留,也可以不被拘留。你的代码不应该依赖于你的字符串被拘留。