Представьте себе следующую программу.
class Main {
static class Whatever {
int x = 0;
}
public static void main(String[] args) {
Whatever whatever = new Whatever();
Thread t = new Thread(() -> {
whatever.x = 1;
});
t.start();
try {
t.join();
}
catch (InterruptedException e) {
}
System.out.println(whatever.x);
}
}
Основной поток кэшировал whatever
, а x
установлен на 0
. Другой поток запускается, кэширует whatever
и устанавливает для кэшированного x
значение 1
.
Выходные данные
1
, поэтому основной поток видел запись. Почему это так?
Почему была сделана запись в общий кеш и почему основной поток сделал недействительным свой кеш для чтения из общего кеша? Почему мне не нужно volatile
здесь?