我看到一个非常有趣的现象,其中多个线程在锁定语句中。我有以下代码部分:
private readonly object _overalllock = new object();
public async Task Method()
{
await Task.Run(() =>
{
lock (_overalllock)
{
//Section A//
}
}
}
在" A部分"块,我开始看到一些有趣的行为。经过进一步调查,我注意到这个区域内有多个线程。我会以为所有线程都会在lock语句中被阻塞,并且只在lock对象变为空闲时才开始执行?
请注意,可以从主线程以外的线程调用上面的代码部分。我错过了什么?
答案 0 :(得分:2)
锁定对象_overalllock
是实例级字段。如果您有多个类的实例,则锁仅在实例级别有效。为了阻止所有线程的访问,无论它们在哪个实例上运行,都需要使锁定对象保持静态:
private static readonly object _overalllock = new object();
有关lock
语句的详细信息,请参阅此link。