2015-08-11 2 views
1

Я читаю исходный код JDK (1.8.0_05). Установлено, что ReentrantLock используется для обеспечения надежных рабочих. Автор просто сказал 2 причины.Использование ReentrantLock в ThreadPoolExecutor для обеспечения надежных рабочих потоков

  • Причина 1:

Это упорядочивает interruptIdleWorkers, что позволяет избежать ненужных прерывают шторма, особенно во время shutdown.Otherwise выходящих потоков бы одновременно прерывают те, которые еще не прерывались.

  • Причина 2:

Это также упрощает некоторые соответствующую статистику бухгалтерское largestPoolSize и т.д..

Может ли кто-нибудь более подробно рассказать о причине, особенно о причине 1? Я просто не понимаю идею на уровне дизайна.

P.S. Как насчет использования Collections.synchronizedSet?

ответ

3

Может ли кто-нибудь более подробно рассказать о причине, в особенности причина 1? Я просто не понимаю идею на уровне дизайна.

Представьте, что это не ReentrantLock, а вместо этого одновременно. Кроме того, давайте представим себе, если 10 потоков вызвали shutdown. Shutdown будет работать interruptIdleWorkers, поэтому каждый из этих 10 потоков будет работать interruptIdleWorkers.

Если это был параллельный набор, то все 10 отключений потоков будут также прерывать каждый поток. Поскольку коллекция является параллельной, тогда каждому из этих 10 потоков не нужно ждать, пока другие будут успешными. Результатом здесь является, как говорили документы, поток прерываний, когда все, что вам действительно нужно, это 1.

Вы можете использовать Collections.synchronizedSet, но вам нужно будет synchronize на всей коллекции. Это может быть хорошо, но если вы можете достичь Причина № 2 с ReentrantLock, чем лучше, чем synchronizedSet.

+0

Да, на самом деле SynchronizedSet понадобится ручная синхронизация в некотором случае, то есть при повторении по заднему набору. По сравнению с синхронизированным, ReentrantLock предпочтительнее. –

+0

Ваше объяснение по причине № 1 также хорошо. :) –