Це питання заслуговує кращої відповіді.
Java ConcurrentLinkedQueue
заснована на відомому алгоритмі Магеда М. Майкла та Майкла Л. Скотта для незаблокування черг без блокування .
"Неблокуючий" як термін тут для суперечливого ресурсу (нашої черги) означає, що незалежно від того, що робить планувальник платформи, як-от переривання потоку, або якщо нитка, про яку йдеться, просто занадто повільна, інші потоки змагаються за той самий ресурс все ще зможе прогресувати. Якщо, наприклад, задіяний замок, то нитка, що тримає замок, може бути перервана, і всі потоки, які чекають цього блокування, будуть заблоковані. Внутрішні блокування ( synchronized
ключове слово) на Java також можуть суворо штрафувати за ефективність, як, наприклад, при необ'єктивному блокуваннізадіяний і у вас є суперечки, або після того, як VM вирішить "надути" замок після періоду граціозного відключення і блокувати нитки, що складаються ... саме тому у багатьох контекстах (сценарії низької / середньої суперечки) роблять порівняння та -набори атомних посилань можуть бути набагато ефективнішими, і саме це робить багато неблокуючих структур даних.
Java ConcurrentLinkedQueue
не тільки не блокує, але й володіє приголомшливою властивістю, яку виробник не суперечить споживачеві. У сценарії одного виробника / єдиного споживача (SPSC) це дійсно означає, що говорити не доводиться. У сценарії декількох виробників / одного споживача споживач не буде протиставлятися виробникам. Ця черга має суперечки, коли намагаються зробити кілька виробників offer()
, але це паралельність за визначенням. Це в основному загальна мета та ефективна неблокуюча черга.
Що стосується того, що це не бути BlockingQueue
добре, блокування нитки чекати в черзі - це дивно жахливий спосіб проектування сумісних систем. Не варто. Якщо ви не можете зрозуміти, як користуватися ConcurrentLinkedQueue
сценарієм споживача / виробника, просто перейдіть до абстракцій вищого рівня, як у хороших акторських рамок.