Implementação de BlockingQueue: Quais são as diferenças entre SynchronousQueue e LinkedBlockingQueue

Eu vejo essas implementações deBlockingQueue e não consigo entender as diferenças entre eles. Minha conclusão até agora:

Eu nunca vou precisarSynchronousQueueLinkedBlockingQueue garante FIFO,BlockingQueue deve ser criado com o parâmetro true para torná-lo FIFOSynchronousQueue quebra o método da maioria das coleções (contém, tamanho, etc.)

Então, quando é que eu precisoSynchronousQueue? O desempenho desta implementação é melhor do queLinkedBlockingQueue?

Para torná-lo mais complicado ... por queExecutors.newCachedThreadPool use SynchronousQueue quando os outros (Executors.newSingleThreadExecutor eExecutors.newFixedThreadPool) use LinkedBlockingQueue?

EDITAR

A primeira pergunta está resolvida. Mas ainda não entendo por queExecutors.newCachedThreadPool use SynchronousQueue quando os outros (Executors.newSingleThreadExecutor eExecutors.newFixedThreadPool) use LinkedBlockingQueue?

O que eu recebo é que, com SynchronousQueue, o produtor será bloqueado se não houver um encadeamento livre. Mas como o número de threads é praticamente ilimitado (novos threads serão criados, se necessário), isso nunca acontecerá. Então, por que ele deve usar o SynchronousQueue?

questionAnswers(3)

yourAnswerToTheQuestion