javadoc для BlockingQueue (суперкласс LinkedBlockingQueue) гласит:
BlockingQueue
реализации являются поточно-ориентированными. Все методы очередей достигают своих эффектов атомарно , используя внутренние блокировки или другие формы управления параллелизмом.
Слово «атомарно» означает, что если две операции (например, put
и take
) происходят одновременно, то реализация обеспечит их поведение в соответствии с контрактом. Эффект будет , как если бы put
происходил до get
или наоборот. Это относится и к крайним случаям, таким как ваш пример очереди с одним элементом.
Фактически, поскольку put
и get
являются блокирующими операциями, относительный порядок этих двух операций не имеет значения. С offer
/ poll
или add
/ remove
заказ имеет значение , но вы не можете его контролировать.
Обратите внимание, что вышесказанное основано исключительно на том, что говорит Javadoc. Если предположить, что я правильно интерпретировал Javadoc, то он применяется ко всем реализациям 1 BlockingQueue
, независимо от того, используют ли они одну или две блокировки ... или вообще ни одной. Если реализация BlockingQueue
ведет себя не так, как описано выше, это ошибка!
1 - Все реализации, которые правильно реализуют API. Это должно охватывать все классы Java SE.