Одно из важных преимуществ производительности ConcurrentLinkedQueue
заключается в том, что вы не беспокоитесь о хвосте при обновлении головы, и наоборот, верно?
В основном это означает, что 2 потока могут одновременно опрашивать / предлагать без вмешательства (если размер очереди не равен 0, то есть).
Это был не тот случай, если у вас был счетчик. Даже если это был AtomicInteger
с хорошим параллелизмом, у вас все равно будет повышенная вероятность неудачных операций CAS, потому что теперь у вас есть «горячая точка», которую вы обновляете каждый раз, когда делаете опрос / предложение.
Не совсем уверен, что авторы имеют в виду это, когда говорят «асинхронный характер», но я думаю, что это самая большая причина, по которой у них нет счетчика, как вы предложили.