Следующий код Java выглядит немного странным, потому что я упростил его до простых вещей. Я думаю, что у кода есть проблема с упорядочением. Я смотрю на первую таблицу в JSR-133 Cookbook, и кажется, что нормальный магазин можно переупорядочить с помощью энергозависимого хранилища в change()
.
Может ли присвоение m_normal
в change()
двигаться впереди назначения m_volatile
? Другими словами, может get()
вернуть null
?
Каков наилучший способ решить эту проблему?
private Object m_normal = new Object();
private volatile Object m_volatile;
public void change() {
Object normal;
normal = m_normal; // Must capture value to avoid double-read
if (normal == null) {
return;
}
m_volatile = normal;
m_normal = null;
}
public Object get() {
Object normal;
normal = m_normal; // Must capture value to avoid double-read
if (normal != null) {
return normal;
}
return m_volatile;
}
Примечание. Я не контролирую код, в котором объявлен m_normal
.
Примечание. Я запускаюсь на Java 8.