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?