我有具有缓存实现的旧代码,如下所示:
long lastUpadate;
...
public void checkCach(){
if(lastUpdated + UPDATE_INTERVAL < System.currentTimeMillis()){
synchronized(this){
//cache update goes here
lastUpdate = System.currentTimeMillis();
}
}
}
在多核处理器环境中是否存在线程无法看到更新的lastUpdate字段的问题,因为它们在同步部分(处理器核心高速缓存的问题)之外进行检查,因此无法看到更新的lastUpdate字段?
更新:也可以将重新排序应用于此同步块,将首先设置lastUpdate字段,然后才执行缓存更新
最佳答案
如果lastUpdate
是字段变量,则将其设置为volatile lastUpdate
强制所有试图查看其值的线程越过内存障碍。因此,您可以保证无论哪个线程正在读取lastUpdate
,它们都将获得最新值。但是要注意,volatile无法保证原子操作。
关于java - 可见度可变,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9466456/