Предположим, что существует такой класс:
public void MyClass {
private boolean someoneTouchedMeWhenIWasWorking;
public void process() {
someoneTouchedMeWhenIWasWorking = false;
doStuff();
synchronized(this) {
if (someoneTouchedMeWhenIWasWorking) {
System.out.println("Hey!");
}
}
}
synchronized public void touch() {
someoneTouchedMeWhenIWasWorking = true;
}
}
Один поток вызывает process
, другой вызывает touch
. Обратите внимание, как process
очищает флаг без синхронизации при его запуске.
С моделью памяти Java, возможно ли, что поток, выполняющий process
, увидит эффект своей локальной, несинхронизированной записи, даже если touch
произошло позже?
То есть, если потоки выполняются в следующем порядке:
T1: someoneTouchedMeWhenIWasWorking = false; // Unsynchronized
T2: someoneTouchedMeWhenIWasWorking = true; // Synchronized
T1: if (someoneTouchedMeWhenIWasWorking) // Synchronized
... возможно ли, что T1 увидит значение из своего локального кеша? Может ли он сбросить то, что он имеет в памяти (переопределив все, что написал T2), и перезагрузить это значение из памяти?
Нужно ли синхронизировать первую запись или сделать переменную изменчивой?
Я был бы очень признателен, если бы ответы были подкреплены документацией или некоторыми респектабельными источниками.