В чем разница между getVolatile и getAcquire? - PullRequest
0 голосов
/ 29 декабря 2018

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

PS: они относятся к

Источник фронта синхронизации с названием называется деблокированием, а назначение - приобретением.

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

1 Ответ

0 голосов
/ 28 августа 2019

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

Это видео приятно видеть для понимания того, что называют "режимами упорядочения памяти": простые, непрозрачные, освобождающие / приобретающие и изменчивые.

...