Все сводится к тому, как мы хотим оптимизировать наш код. Оптимизация с точки зрения переупорядочивания кода. Компилятор может изменить порядок для оптимизации. 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. Никакого переупорядочения или оптимизации не происходит.
Это видео полезно посмотреть, чтобы понять, что называется "режимами упорядочения памяти". простой, непрозрачный, выпуск/приобретение и изменчивый.
person
Ali Ben Zarrouk
schedule
28.08.2019