ArrayBlockingQueue использует одну блокировку для вставки и удаления, а LinkedBlockingQueue использует 2 отдельные блокировки.

Я просматривал исходный код ArrayBlockingQueue и LinkedBlockingQueue. LinkedBlockingQueue имеет putLock и takeLock для вставки и удаления соответственно, но ArrayBlockingQueue использует только 1 блокировку. Я полагаю, что LinkedBlockingQueue была реализована на основе схемы, описанной в Simple, Fast, and Practice Non-Blocking and Blocking. Алгоритмы параллельных очередей. В этой статье они упоминают, что они сохраняют фиктивный узел, чтобы участникам, ставящим в очередь, никогда не приходилось обращаться к голове, а участникам, удаляющим очередь, никогда не приходилось обращаться к хвосту, что позволяет избежать сценариев взаимоблокировки. Мне было интересно, почему ArrayBlockingQueue не использует ту же идею и вместо этого использует 2 блокировки.

9
задан user1168577 13 June 2012 в 13:11
поделиться