Этот вопрос заслуживает лучшего ответа.
Java ConcurrentLinkedQueue
основан на известном алгоритме, разработанном Магедом М. Майклом и Майклом Л. Скоттом для неблокирующей и свободной от блокировки очередей.
«Неблокирующий» здесь термин для конкурирующего ресурса (наша очередь) означает, что независимо от того, что делает планировщик платформы, например, прерывает поток, или если рассматриваемый поток просто слишком медленный, другие потоки конкурируют за тот же ресурс все еще сможет прогрессировать. Если, например, задействована блокировка, поток, удерживающий блокировку, может быть прерван, и все потоки, ожидающие этой блокировки, будут заблокированы. Внутренние блокировки ( synchronized
ключевое слово) в Java также могут иметь серьезные последствия для производительности - например, при смещенной блокировке.вовлечен, и у вас действительно есть конкуренция, или после того, как виртуальная машина решит «раздуть» блокировку после периода отсрочки вращения и заблокировать конкурирующие потоки ... вот почему во многих контекстах (сценарии низкой / средней конкуренции) выполняется сравнение и -наборы по атомарным ссылкам могут быть гораздо более эффективными, и это именно то, что делают многие неблокирующие структуры данных.
Java ConcurrentLinkedQueue
не только не блокирует, но и обладает замечательным свойством, которое производитель не борется с потребителем. В сценарии с одним производителем и одним потребителем (SPSC) это действительно означает, что не будет никаких разногласий. В сценарии с несколькими производителями и одним потребителем потребитель не будет бороться с производителями. Эта очередь действительно имеет конкуренцию, когда несколько производителей пытаются сделать это offer()
, но это по определению параллелизм. Это в основном универсальная и эффективная неблокирующая очередь.
Что касается того, что это не ... BlockingQueue
ну, блокирование потока для ожидания в очереди - это ужасно ужасный способ проектирования параллельных систем. Не. Если вы не можете понять, как использовать a ConcurrentLinkedQueue
в сценарии потребителя / производителя, просто переключитесь на абстракции более высокого уровня, например, на хорошую структуру акторов.