我正在阅读JDK源代码(1.8.0_05)。发现ReentrantLock用于确保线程安全的工作人员。作者刚说了两个理由。
这会将interruptIdleWorkers序列化,避免不必要 中断风暴,特别是在shutdown.Otherwise退出线程 将同时中断那些尚未中断的。
它还简化了一些 maxPoolSize等相关统计簿记。
任何人都可以详细说明原因,尤其是原因1吗?我只是不明白设计层面的想法。
P.S。如何使用Collections.synchronizedSet?
答案 0 :(得分:3)
任何人都可以详细说明原因,尤其是理由 1?我只是不了解设计层面的想法。
想象一下,如果它不是ReentrantLock
而是并发集。另外,让我们想象一下如果调用10个线程shutdown
。关机将运行interruptIdleWorkers
,因此这10个线程中的每一个都将运行interruptIdleWorkers
。
如果它是并发集,那么所有10个线程关闭也会中断每个线程。由于集合是并发的,因此这10个线程中的每一个都不需要等待其他线程成功。正如文档所说,这里的结果是,当你真正想要的只是1时,大量的中断。
您可以使用Collections.synchronizedSet
,但您必须synchronize
整个集合。这可能没问题,但如果你能用ReentrantLock
实现原因#2 ,那么它比synchronizedSet
更合适。