Olá, estou em dúvida qual a diferença entre ambas. Pois acredito que as duas são bloqueantes correto? Mas qual a real diferença entre elas?
A BlockingQueue, como o nome diz, é uma fila. Obrigatóriamente o primeiro elemento que entra será o primeiro elemento a sair. Existem vários tipos de BlockingQueues, pois se trata apenas de uma interface. Um tipo comumente usado é o LinkedBlockingQueue que usa por debaixo dos panos uma lista ligada.
O synchronizedList é um wrapper, ou seja, uma classe que encapsula uma lista. Ele coloca todos os métodos de uma lista qualquer (seja ela Array ou Linked) como synchronized. Você ainda poderá ler, inserir ou retirar qualquer elemento da lista em qualquer ordem.
Mas como uma synchronizedList utiliza synchronized e possuo duas Threads A e B, se A inserir um elemento nesta fila B não conseguirá remover até que A acabe de inserir isso?
Não. O synchronizedList não é bloqueante. Ela se comporta como a lista que ela encapsula (um ArrayList, por exemplo), com a garantia de que duas threads as acessando concorrentemente não “estragarão” a lista. No mais, ela não implementa qualquer mecanismo de espera. Se a thread A tentar retirar da lista vazia, a lista dirá que esse objeto não existe lá (seja por uma exception ou por um boolean) e retornará imediatamente, sem bloqueio.
Uma synchronizedList é uma alternativa da Collections Framework para a classe de legado Vector.