C#:锁定块内的多个线程

时间:2015-11-11 14:00:55

标签: c# multithreading

我看到一个非常有趣的现象,其中多个线程在锁定语句中。我有以下代码部分:

private readonly object _overalllock = new object();

public async Task Method()
{
    await Task.Run(() =>
               {
                   lock (_overalllock)
                   {
                      //Section A//
                   }
               }
}

在" A部分"块,我开始看到一些有趣的行为。经过进一步调查,我注意到这个区域内有多个线程。我会以为所有线程都会在lock语句中被阻塞,并且只在lock对象变为空闲时才开始执行?

请注意,可以从主线程以外的线程调用上面的代码部分。我错过了什么?

1 个答案:

答案 0 :(得分:2)

锁定对象_overalllock是实例级字段。如果您有多个类的实例,则锁仅在实例级别有效。为了阻止所有线程的访问,无论它们在哪个实例上运行,都需要使锁定对象保持静态:

private static readonly object _overalllock = new object();

有关lock语句的详细信息,请参阅此link