Java AbstractQueuedSynchronizer
(и его брат AbstractQueuedLongSynchronizer
) работает аналогично, или, по крайней мере, может быть реализован аналогичным образом. Эти типы формируют основу для нескольких примитивов параллелизма в библиотеке Java, таких как ReentrantLock
и FutureTask
.
Он работает посредством использования атомного целого числа для представления состояния. Блокировка может определить значение 0 как разблокированное и 1 как заблокированное. Любой поток, желающий получить блокировку, пытается изменить состояние блокировки с 0 на 1 с помощью атомарной операции сравнение и установка ; если попытка не удалась, текущее состояние не равно 0, что означает, что блокировка принадлежит другому потоку.
AbstractQueuedSynchronizer
также облегчает ожидание блокировок и уведомление о условиях , поддерживая очереди CLH , которые являются связанными без блокировки списками, представляющими строку потоков, ожидающих либо получения блокировки или получить уведомление через условие. Такое уведомление перемещает один или все потоки, ожидающие в состоянии, в начало очереди тех, кто ожидает получения соответствующей блокировки.
Большинство этого механизма могут быть реализованы в виде атомного целого числа, представляющего состояние, а также пары атомных указателей для каждой очереди ожидания. Фактическое планирование того, какие потоки будут бороться за проверку и изменение переменной состояния (например, через AbstractQueuedSynchronizer#tryAcquire(int)
), выходит за рамки такой библиотеки и попадает в планировщик хост-системы.