C#:锁块内的多个线程
Posted
技术标签:
【中文标题】C#:锁块内的多个线程【英文标题】:C#: Multiple Threads Inside Lock Block 【发布时间】:2015-11-11 14:00:54 【问题描述】:我看到了一个非常有趣的现象,多个线程在一个 lock 语句中。我有以下代码部分:
private readonly object _overalllock = new object();
public async Task Method()
await Task.Run(() =>
lock (_overalllock)
//Section A//
在“Section A”块中,我开始看到一些有趣的行为。在进一步调查中,我注意到该区域内有多个线程。我会认为所有线程都会在 lock 语句处被阻塞,并且只有在 lock 对象空闲时才开始执行?
还请注意,上面的代码部分可以从主线程以外的线程调用。我错过了什么?
【问题讨论】:
您能提供minimal reproducible example吗? _overalllock 什么时候更新?它们是否在类的单独实例中? 在任务中加锁会破坏其目的。 你想要实现什么,为什么你认为你需要一个锁?如果您有发布/订阅场景,为什么不使用 BlockingQueue 或 ActionBlock? 【参考方案1】:锁定对象_overalllock
是实例级字段。如果您有该类的多个实例,则锁定仅在实例级别有效。为了阻塞所有线程的访问,无论它们在哪个实例上操作,都需要将锁对象设为静态:
private static readonly object _overalllock = new object();
有关lock
声明的详细信息,请参阅此link。
【讨论】:
您也可以介绍自己的Singleton
并将其锁定在您的应用中。以上是关于C#:锁块内的多个线程的主要内容,如果未能解决你的问题,请参考以下文章