我有遗留代码,其缓存实现如下所示:
long lastUpadate;
...
public void checkCach(){
if(lastUpdated + UPDATE_INTERVAL < System.currentTimeMillis()){
synchronized(this){
//cache update goes here
lastUpdate = System.currentTimeMillis();
}
}
}
多核处理器环境中是否存在线程无法看到更新的lastUpdate字段的问题,因为它们在同步部分(处理器核心缓存的问题)之外检查它?
更新:也可以重新排序应用于此同步块,将设置第一个lastUpdate字段,然后才会执行缓存更新
答案 0 :(得分:1)
线程的多核处理器环境是否存在问题? 不会看到更新的lastUpdate字段,因为他们在外面检查它 同步部分(处理器核心缓存的问题)?
是。必须同步对共享数据的读取和写入,以确保在多线程环境中可见。
答案 1 :(得分:1)
如果lastUpdate
是字段变量,则将其设置为volatile lastUpdate
以强制所有尝试查看其值的线程穿过内存屏障。因此,您可以保证无论读取lastUpdate
的任何线程,它们都将获得最新值。请注意,volatile不能保证原子操作。