LINUX.ORG.RU

История изменений

Исправление 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