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#:锁块内的多个线程的主要内容,如果未能解决你的问题,请参考以下文章

锁内的新线程 - c#

如何等待Jenkinsfile“并行”块内的所有执行程序?

Redis事务的操作

C# 正则表达式 - 为括号内的单个模式查找一个或多个匹配项

使用多线程c#创建多个文件

C#中多个线程之间的拆分操作