Allora scusa .... dove sta l'attesa? Cioè il concetto di "bloccante" dove entra in tutto questo?
Generalmente le code "sincronizzate"/"bloccanti" più semplici e basilari hanno un singolo lock, per cui c'è effettivamente mutua esclusione tra chi inserisce e chi estrae. Il lock comunque serve in questo caso sia per la atomicità sia per la visibilità delle modifiche da parte degli altri thread.
Ma è perfettamente possibile creare una coda più sofisticata che permette una maggior concorrenza ... si tratta solo di sfruttare in modo migliore e più sofisticato le tecniche di locking.
Per es. java.util.concurrent.ConcurrentLinkedDeque (da Java 7 in poi) è una "deque" (che sta per "double ended queue") è appunto una collezione in cui, come dice la documentazione: Concurrent insertion, removal, and access operations execute safely across multiple threads. Però è un-bounded (senza limite).
EDIT: ho verificato bene adesso, ConcurrentLinkedDeque non è "bloccante". Era comunque solo come esempio di maggior concorrenza.
Quello che non è ancora chiaro è dove rientra il concetto di "bloccante" nel contesto chiesto/indicato da te.![]()