我有具有缓存实现的旧代码,如下所示:

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/

10-09 15:30