История изменений
Исправление
vertexua,
(текущая версия)
:
Если нужно, например, взять содержимое RingBuffer'а, произвести вычисление, потом добавить результат в RingBuffer, то такая процедура требует как минимум трех операций и сделать ее атомарной никак не получится (при этом, она будет зависеть от содержимого RingBuffer'а т.е. от состояния нескольких объектов - и тут без lock'ов не обойтись)?
Atomic != Lock-free. Точнее то что Lock Free не обязательно Atomic. Насчет обратного, тут сложнее.
Атомарные операции в принципе редко бывают. Чаще всего все упирается в Optimistic Locking, Compare and Swap цикл. Берешь данные, запоминаешь, модифицируешь, пытаешься поменять. Вышло - успех. Если кто-то значение заменил уже - заново. Так работает AtomicLong (atomic как моя жопа) между прочим, и никакой магии. И ад начинается когда потоков много. В Java 8 вот LongAdder придумали, который использует хеш-код потока чтобы добавлять значения в одельные buckets/cells. А сумма там вообще без синхронизаций, как попало, гарантий нет. Есть только гарантия что не будет порваных Long, потому что они volatile
Исходная версия
vertexua,
:
Если нужно, например, взять содержимое RingBuffer'а, произвести вычисление, потом добавить результат в RingBuffer, то такая процедура требует как минимум трех операций и сделать ее атомарной никак не получится (при этом, она будет зависеть от содержимого RingBuffer'а т.е. от состояния нескольких объектов - и тут без lock'ов не обойтись)?
Atomic != Lock-free. Точнее то что Lock Free не обязательно Atomic. Насчет обратного, тут сложнее.
Атомарные операции в принципе редко бывают. Чаще всего все упирается в Optimistic Locking, Compare and Swap цикл. Берешь данные, запоминаешь, модифицируешь, пытаешься поменять. Вышло - успех. Если кто-то значение заменил уже - заново. Так работает Atomic Long между прочим, и никакой магии. И ад начинается когда потоков много. В Java 8 вот LongAdder придумали, который использует хеш-код потока чтобы добавлять значения в одельные buckets/cells. А сумма там вообще без синхронизаций, как попало, гарантий нет. Есть только гарантия что не будет порваных Long, потому что они volatile