在ThreadPoolExecutor中使用ReentrantLock来确保线程安全的工作者

时间:2015-08-11 12:41:53

标签: java multithreading threadpoolexecutor

我正在阅读JDK源代码(1.8.0_05)。发现ReentrantLock用于确保线程安全的工作人员。作者刚说了两个理由。

  • 原因1:
  

这会将interruptIdleWorkers序列化,避免不必要   中断风暴,特别是在shutdown.Otherwise退出线程   将同时中断那些尚未中断的

  • 原因2:
  

它还简化了一些 maxPoolSize等相关统计簿记

任何人都可以详细说明原因,尤其是原因1吗?我只是不明白设计层面的想法。

P.S。如何使用Collections.synchronizedSet?

1 个答案:

答案 0 :(得分:3)

  

任何人都可以详细说明原因,尤其是理由   1?我只是不了解设计层面的想法。

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

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

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