Реализация BlockingQueue: В чем разница между SynchronousQueue и LinkedBlockingQueue

Я вижу эти реализации BlockingQueue и не могу понять различий между ними. Мой вывод на данный момент:

  1. Мне никогда не понадобится SynchronousQueue
  2. LinkedBlockingQueue гарантирует, что FIFO, BlockingQueue должен быть создан с параметром true, чтобы он стал FIFO
  3. SynchronousQueue нарушает большинство методов коллекций (содержит, размер и т. Д.)

Итак, когда мне когда-нибудь понадобится SynchronousQueue ? Производительность этой реализации лучше, чем у LinkedBlockingQueue ?

Чтобы усложнить задачу ... почему Executors.newCachedThreadPool использует SynchronousQueue, тогда как другие ( Executors.newSingleThreadExecutors.newSingleThreadExecut и Исполнители. newFixedThreadPool ) использовать LinkedBlockingQueue?

EDIT

Первый вопрос решен. Но я до сих пор не понимаю, почему Executors.newCachedThreadPool использует SynchronousQueue, когда другие ( Executors.newSingleThreadExecutor и Executors.newFixedThreadPool] используют LinkedBlockingQueue )

Я получаю, что с SynchronousQueue производитель будет заблокирован, если нет свободного потока. Но поскольку количество потоков практически не ограничено (при необходимости будут созданы новые потоки), этого никогда не произойдет. Так почему он должен использовать SynchronousQueue?

32
задан nanda 24 February 2011 в 10:09
поделиться