Всегда ли следующий код будет распечатывать «правильное» значение данных? Даже если есть другие операции между присвоением значений data и dataReady в методе setData?
Или же JVM могла бы изменить порядок этих операций так, чтобы RunningThread мог видеть dataReady как истинное, в то время как данные все еще были пустыми?
Если код безопасный и правильный - что такого в изменчивом поле, которое предотвращает проблемы с переупорядочением? Означает ли это, что сами данные даже не обязательно должны быть изменчивыми, что есть что-то в том, чтобы сделать только dataReady изменчивым, что заставляет JVM не кэшировать локальные значения для других полей экземпляра, в котором одно поле является изменчивым?
public class RunningThread implements Runnable {
private volatile boolean dataReady = false;
private volatile String data = null;
public void run() {
while (!dataReady){
//Do stuff or wait
}
System.out.println("Value of data '" +data +"' is definitely not null.");
}
//setData called by another thread
public void setData(String dataToSet){
if (dataToSet!=null){
data = dataToSet;
dataReady = true;
}
}
}