gpt4 book ai didi

java - 在 ThreadPoolExecutor 中使用 ReentrantLock 保证线程安全的 worker

转载 作者:行者123 更新时间:2023-11-29 05:01:41 25 4
gpt4 key购买 nike

我正在阅读 JDK 源代码(1.8.0_05)。发现ReentrantLock是用来保证worker线程安全的。作者只是说了两个原因。

  • 原因 1:

This serializes interruptIdleWorkers, which avoids unnecessary interrupt storms, especially during shutdown.Otherwise exiting threads would concurrently interrupt those that have not yet interrupted.

  • 原因 2:

It also simplifies some of the associated statistics bookkeeping of largestPoolSize etc.

谁能详细说明原因,尤其是原因 1?我只是不明白设计层面的想法。

附言使用 Collections.synchronizedSet 怎么样?

最佳答案

Can anybody elaborate more details about the reason, especially Reason 1? I just don't understand the idea on design level.

想象一下,如果它不是一个 ReentrantLock 而是一个并发集。此外,让我们想象一下,如果有 10 个线程调用了 shutdown。关机将运行 interruptIdleWorkers,因此这 10 个线程中的每一个都将运行 interruptIdleWorkers

如果是并发集,那么所有关闭的10个线程也会中断每个线程。由于收集是并发的,因此这 10 个线程中的每一个都不需要等待其他线程成功。正如文档所说,这里的结果是大量中断,而您真正想要的只是 1。

您可以使用 Collections.synchronizedSet,但您必须对整个集合进行同步。这可能没问题,但如果您可以使用 ReentrantLock 实现原因 #2,那么它比 synchronizedSet 更合适。

关于java - 在 ThreadPoolExecutor 中使用 ReentrantLock 保证线程安全的 worker,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31942117/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com