Все возвращается к тому, как мы хотим оптимизировать наш код.Оптимизация с точки зрения переупорядочения кода.Компилятор может изменить порядок для оптимизации.getAquire
гарантирует, что последующие инструкции не будут выполнены до него.Эти инструкции могут быть переупорядочены, но они всегда будут выполняться после getAquire
.
. Это работает в сочетании с setRelease
(для VarHandle
), где setRelease
гарантирует, что происходит до того, как оно не переупорядочено.произойдет после него.
Пример:
Thread1:
var x = 1;
var y = 2;
var z = 3;
A.setRelease(this, 10)
назначения x, y и z произойдут до A.setRelease, но могут быть переупорядочены сами.
Thread 2:
if (A.getAquire(this) == 10) {
// we know that x is 1, y is 2 and z = 3
}
Это хороший вариант использования для параллельной программы, когда вам не нужно увеличивать волатильность для всего, а просто нужно выполнить некоторые инструкции перед другой.
Для getVolatile
, переменнаярассматривается как любая переменная в Java.Никакого переупорядочения или оптимизации не происходит.
Это видео приятно видеть для понимания того, что называют "режимами упорядочения памяти": простые, непрозрачные, освобождающие / приобретающие и изменчивые.