mesmo:
1. LinkedBlockingQueue e ArrayBlockingQueue implementam a interface BlockingQueue;
2. LinkedBlockingQueue e ArrayBlockingQueue são filas bloqueáveis
Reentrantlock e condição são usados internamente para garantir a sincronização da produção e consumo;
Quando a fila está vazia, o thread do consumidor é bloqueado; Quando a fila está cheia, o tópico do produtor é bloqueado;
Use o método da condição para sincronizar e se comunicar: aguardar () e sinal ()
diferente:
1. Como pode ser visto na figura acima, seu mecanismo de travamento é diferente.
Os bloqueios no LinkedBlockingQuee são separados, a putlock de trava do produtor e a trava do consumidor Takelock
Produtores e consumidores ArrayBlockingQueue usam o mesmo bloqueio;
2. Seu mecanismo de implementação subjacente também é diferente
O LinkedBlockingQueue mantém uma estrutura de lista vinculada internamente
Durante a produção e o consumo, os objetos do nó precisam ser criados para inserção ou remoção. Em sistemas com grandes lotes de dados, a pressão sobre o GC será maior.
ArrayblockingQuee mantém uma matriz internamente
Durante a produção e o consumo, os objetos de enumeração são diretamente inseridos ou removidos e nenhuma instância de objetos adicionais é gerada ou destruída.
3. Diferenças na construção
O LinkedBlockingQueue possui um tamanho de capacidade padrão: Integer.max_value, é claro, você também pode passar no tamanho da capacidade especificada.
Ao inicializar o ArrayBlockingQueue, um valor de capacidade deve ser passado.
Você pode saber olhando para o método de construção fornecido por ele
4. Execute o método clear ()
Quando o LinkedBlockingQueue executa o método claro, dois bloqueios serão adicionados.
5. Estatísticas o número de elementos
Um objeto AtomicInteger é usado no LinkedBlockockQueue para contar o número de elementos
ArrayblockingQueue usa o tipo int para contar elementos