многопоточности. Есть такой метод у атомиков lazySet(). Судя по документации - он не допускает реордеринга операций при записи, но не гарантирует строгую видимость как volatile write. Так вот, наткнулся на него, пару лет назад когда дебажил очередную реактивную либу, вопрос: какие оптимизации на основе него можно делать? При условии что в другом потоке обновленное значение все равно не будет гарантировано видно сразу( не понятно, как это можно использовать) ?
Банально например чтобы в такой ситуации:
int x = 0;
AtomicInteger aX = new AtomicInteger(0);
x = 1;
aX.lazySet(1);
не прочитать x = 0, если прочли, что aX = 1;
А если прочитали aX = 0, то х либо 0 либо 1.
lazySet -- это то, что везде называется "release", например, VarHandle.setRelease. Поэтому ваш пример работает как надо. Единственное, что он не гарантирует (т.е. слабее чем volatile) -- это глобальный консенсус. См. "Release-Acquire (RA)" здесь: http://gee.cs.oswego.edu/dl/html/j9mm.html
Обсуждают сегодня