锁定字段或局部变量?

在我从Marc 的回答中读到这个问题之后….

我有时看到人们锁定局部变量。

这段代码坏了吗?

public void Do() { object o = new Object(); lock (o) { ... } } 

我相信object o = new Object(); 应该在方法之外作为Field

由于每个线程都获得了一个新的o实例,因此会有多个锁。

我在这里想念的是什么? 在这种特定情况下,它不应该锁定字段吗?

我相信对象o = new Object(); 应该在方法之外作为Field。

由于每个线程都获得了一个新的o实例,因此会有多个锁。

这里有什么我想念的吗? 因为我知道它应该锁定字段(在这种特定情况下)。

你的理解是正确的。 代码被破坏。在这个实现中,即使lock处于活动状态,它也不会提供同步,因为它将在不同的对象上。

来自MSDN-lock c#

通常,避免锁定公共类型或超出代码控制范围的实例。 常见的构造锁(this),lock(typeof(MyType))和lock(“myLock”)违反了这个准则:

  • 如果可以公开访问实例,则锁定(this)是一个问题。
  • 如果MyType可公开访问,则lock(typeof(MyType))是一个问题。
  • lock(“myLock”)是一个问题,因为进程中的任何其他代码使用相同的字符串,将共享相同的锁。

最佳做法是定义要锁定的私有对象,或私有静态对象变量以保护所有实例共有的数据。

是。 它被打破。

您希望将静态只读对象作为要锁定的私有字段。 正如您所怀疑的那样,每次调用Do时,您的示例代码都会创建一个新对象,因此锁定将无法保留并且根本无法工作。

 private static object syncRoot = new object(); lock (syncRoot) { } 

每次调用方法时都在创建o对象。 所以,锁定不起作用。 我的意思是其他线程不会等待锁无信号并且控制对此锁控制的资源的控制。 通常,锁对象是类中的私有变量,因此所有方法都会查看同一个对象。

我个人认为没有任何理由使用它,因为lock只是将o实例中的特殊字段设置为信号状态。 所以其他线程可以检查该实例的状态,并根据它执行lock语句中的代码或等待它的释放。

每次都有局部变量将分配一个新实例,因此对于每个线程都可以。

在这看不出任何意义。

锁定局部变量,锁定赢得了工作。 锁定全局变量可以使多个线程同步。

 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Threading; namespace testLock { class Program { public static void Main() { // Start a thread that calls a parameterized static method. for(int i = 0; i< 10;i++) { Thread newThread = new Thread(DoWork); newThread.Start(i); } Console.ReadLine(); } static object gObject= new object(); public static void DoWork(object data) { int len = (int)data % 3; object tmp = new object(); Console.WriteLine("to lock...... Data='{0}' sleepTime:{1}", data, len); lock (tmp)//tmp won't work, change tmp to gObject to see different output, which is good locking case) { Console.WriteLine("in lock...... Data='{0}' sleepTime:{1}", data, len); Thread.Sleep( len* 1000); Console.WriteLine("Static thread procedure. Data='{0}' sleepTime:{1}", data, len); } } } } **Lock temp variable,will output:** to lock...... Data='1' sleepTime:1 in lock...... Data='1' sleepTime:1 to lock...... Data='2' sleepTime:2 in lock...... Data='2' sleepTime:2 to lock...... Data='0' sleepTime:0 in lock...... Data='0' sleepTime:0 Static thread procedure. Data='0' sleepTime:0 to lock...... Data='3' sleepTime:0 in lock...... Data='3' sleepTime:0 Static thread procedure. Data='3' sleepTime:0 to lock...... Data='4' sleepTime:1 in lock...... Data='4' sleepTime:1 to lock...... Data='5' sleepTime:2 in lock...... Data='5' sleepTime:2 to lock...... Data='6' sleepTime:0 in lock...... Data='6' sleepTime:0 Static thread procedure. Data='6' sleepTime:0 to lock...... Data='7' sleepTime:1 in lock...... Data='7' sleepTime:1 to lock...... Data='8' sleepTime:2 in lock...... Data='8' sleepTime:2 to lock...... Data='9' sleepTime:0 in lock...... Data='9' sleepTime:0 Static thread procedure. Data='9' sleepTime:0 Static thread procedure. Data='1' sleepTime:1 Static thread procedure. Data='4' sleepTime:1 Static thread procedure. Data='7' sleepTime:1 Static thread procedure. Data='2' sleepTime:2 Static thread procedure. Data='5' sleepTime:2 Static thread procedure. Data='8' sleepTime:2 **Then lock gObject, will print:** to lock...... Data='0' sleepTime:0 in lock...... Data='0' sleepTime:0 to lock...... Data='1' sleepTime:1 to lock...... Data='2' sleepTime:2 Static thread procedure. Data='0' sleepTime:0 in lock...... Data='1' sleepTime:1 to lock...... Data='3' sleepTime:0 to lock...... Data='4' sleepTime:1 to lock...... Data='5' sleepTime:2 to lock...... Data='6' sleepTime:0 to lock...... Data='7' sleepTime:1 to lock...... Data='8' sleepTime:2 to lock...... Data='9' sleepTime:0 Static thread procedure. Data='1' sleepTime:1 in lock...... Data='5' sleepTime:2 Static thread procedure. Data='5' sleepTime:2 in lock...... Data='9' sleepTime:0 Static thread procedure. Data='9' sleepTime:0 in lock...... Data='2' sleepTime:2 Static thread procedure. Data='2' sleepTime:2 in lock...... Data='8' sleepTime:2 Static thread procedure. Data='8' sleepTime:2 in lock...... Data='7' sleepTime:1 Static thread procedure. Data='7' sleepTime:1 in lock...... Data='4' sleepTime:1 Static thread procedure. Data='4' sleepTime:1 in lock...... Data='3' sleepTime:0 Static thread procedure. Data='3' sleepTime:0 in lock...... Data='6' sleepTime:0 Static thread procedure. Data='6' sleepTime:0