如果我在另一个线程使用该变量时锁定一个对象会发生什么?

Ali*_*ile 4 c# multithreading locking

我不确定锁是如何工作的.
如果我有一个List<T> list和两个线程会发生什么?
如果thread1首先开始运行并枚举该列表会发生什么

foreach(T t in list)
{
  // code
}
Run Code Online (Sandbox Code Playgroud)

并且在同一时间,但在thread1启动后,thread2将锁定列表

lock(list)
{ 
  // code
}
Run Code Online (Sandbox Code Playgroud)

我使用ThreadPooldo进行一些处理,我需要知道锁是如何工作的,如果是线程安全的

ThreadPool.QueueUserWorkItem(new WaitCallback(method), obj);
Run Code Online (Sandbox Code Playgroud)

Dzm*_*uba 5

lock关键字不会"锁定"或"冻结"目标对象(在某种意义上阻止更改).

lock确保一个线程不进入代码的关键部分而另一个线程处于临界区.如果另一个线程试图输入锁定的代码,它将等待,阻止,直到该对象被释放.

因此,在您的情况下,它不会阻止其他线程枚举列表.


Mar*_*ell 5

在编写的代码中 - 枚举器将继续运行.关键lock是你的所有代码都需要同意.如果你曾经使用过:

lock(list)
{
    foreach(T t in list)
    {
        // code
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,当你的另一个线程尝试获取锁时,它将在第一个线程后面排队 - 等待第一个线程释放锁(通过退出lock(Monitor.Exit)或调用Monitor.Wait).