Является ли запись в энергозависимый барьер памяти в Java - программирование
Подтвердить что ты не робот

Является ли запись в энергозависимый барьер памяти в Java

Недавно я услышал в разговоре, что запись в volatile вызывает барьер памяти для каждой переменной, к которой писал поток. Это действительно правильно? Из JLS кажется, что только соответствующая переменная разряжается, но не другие. Кто-нибудь знает, что на самом деле правильно? Можно ли указать мне конкретное место в JLS?

4b9b3361

Ответ 1

Ссылка на Изменчивые переменные и другие переменные была правильной. Я не понимал, что транзитивность события-раньше - это то, что должно быть реализовано VM, а не то, что следует из определения. Я все еще озадачен тем, что что-то с такими далеко идущими последствиями не указано четко, а на самом деле является следствием некоторого определения. Для его завершения: предположим, что у вас есть 4 действия, подобные этому:

thread1        thread2
a1
a2
                a3
                a4

где a2 - это запись в изменчивую переменную v, а a3 - чтение из той же изменчивой переменной v. Из определения случившегося (до) (hb) следует, что hb (a1, a2) и hb (a3, a4). Кроме того, для летучих мы имеем hb (a2, a3). Из требуемой транзитивности hb теперь следует, что hb (a1, a3). Таким образом, запись и последующее чтение изменчивой переменной v функционируют как барьер памяти.

Ответ 2

Да, это вызовет барьер. Здесь вы можете прочитать . Существует 4 типа LoadLoad LoadStore StoreStore StoreLoad.

Что касается вашего вопроса

Из JLS кажется, что только соответствующая переменная вспыхивает но не другие. Кто-нибудь знает, что на самом деле правильно?

Все записи, которые происходят до того, как энергозависимое хранилище видны другими потоками с предикатом, которые другие потоки загружают в это новое хранилище. Тем не менее, записи, которые происходят до того, как изменчивая нагрузка может или не может быть замечена другими потоками, если они не загружают новое значение.

Для практического примера

volatile int a =0;
int b = 0;

Thread-1
b = 10;
a = 3;

Thread-2
if(a == 0){
  // b can b 10 or 0
} 
if(a == 3){
   // b is guaranteed to be 10 (according to the JMM)
}