У меня есть устаревший код с реализацией кэша, которая выглядит следующим образом:
long lastUpadate;
...
public void checkCach(){
if(lastUpdated + UPDATE_INTERVAL < System.currentTimeMillis()){
synchronized(this){
//cache update goes here
lastUpdate = System.currentTimeMillis();
}
}
}
Может ли быть проблема в среде многоядерного процессора, из-за которой потоки не увидят обновленное поле lastUpdate, поскольку они проверяют его вне синхронизированного раздела(выпуск процессорных кешей ядра)?
Обновлено: также можно применить переупорядочение к этому синхронизированному блоку, установить первое поле lastUpdate, и только после этого будет выполнено обновление кэша