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.
}
}
我的第一个反应是,代码中的锁不起作用,因为我们正在创建锁并以相同的方法使用它。调用此方法的每个线程都有自己的锁副本,因此不会进行同步
但后来我意识到这应该是可行的,因为字符串进入字符串池,并且只有一个特定字符串的实例。我不确定我是否正确。锁定字符串是非常糟糕的。不要这样做。你不能保证其他聪明的灵魂也不会锁定弦,因为弦的练习使弦实际上是“超级”全局的,一旦这成为公认的练习,轮子就会掉下来 锁定只有一个用途的私有对象。。。锁定。字符串不符合此描述
锁定字符串是非常糟糕的。不要这样做。你不能保证其他聪明的灵魂也不会锁定弦,因为弦的练习使弦实际上是“超级”全局的,一旦这成为公认的练习,轮子就会掉下来 锁定只有一个用途的私有对象。。。锁定。字符串不符合此描述
您需要将锁设置为“静态”,以便每个线程都可以访问它。“因为字符串进入字符串池”-字符串可能会被占用,也可能不会被占用。你的代码不应该依赖于你的字符串被拘留。你需要将锁设置为“静态”,这样每个线程都可以访问它。“因为字符串进入字符串池”-字符串可以被拘留,也可以不被拘留。你的代码不应该依赖于你的字符串被拘留。