Я вижу эту реализацию BlockingQueue и не могу понять различия между ними. Мой вывод:
- Мне никогда не понадобится SynchronousQueue
- LinkedBlockingQueue обеспечивает FIFO, BlockingQueue должен быть создан с параметром true, чтобы сделать его FIFO
- SynchronousQueue ломает метод большинства коллекций (содержит, размер и т.д.)
Итак, когда мне когда-нибудь понадобится SynchronousQueue? Является ли производительность этой реализации лучше, чем LinkedBlockingQueue?
Чтобы сделать его более сложным... почему Executors.newCachedThreadPool использует SynchronousQueue, когда остальные (Executors.newSingleThreadExecutor и Executors.newFixedThreadPool) использовать LinkedBlockingQueue?
ИЗМЕНИТЬ
Первый вопрос решается. Но я до сих пор не понимаю, почему Executors.newCachedThreadPool использует SynchronousQueue, когда другие (Executors.newSingleThreadExecutor и Executors.newFixedThreadPool) используют LinkedBlockingQueue?
То, что я получаю, с SynchronousQueue, производитель будет заблокирован, если нет свободной нити. Но поскольку количество потоков практически неограничено (при необходимости будут созданы новые потоки), этого никогда не произойдет. Итак, почему он должен использовать SynchronousQueue?