В чем разница между getVolatile и getAcquire?

В чем разница между getVolatile и getAcquire при использовании, например. Атомарное целое?

PS: они связаны с

Источник синхронизируемого с краем называется выпуском, а пункт назначения — приобретением.

из https://docs.oracle.com/javase/specs/jls/se8/html/jls-17.html#jls-17.3


person adrhc    schedule 28.12.2018    source источник


Ответы (1)


Все сводится к тому, как мы хотим оптимизировать наш код. Оптимизация с точки зрения переупорядочивания кода. Компилятор может изменить порядок для оптимизации. 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