Java 可变可见性

Java 可变可见性,java,caching,concurrency,Java,Caching,Concurrency,我有一个遗留代码,它的缓存实现如下所示: long lastUpadate; ... public void checkCach(){ if(lastUpdated + UPDATE_INTERVAL < System.currentTimeMillis()){ synchronized(this){ //cache update goes here lastUpdate = System.cur

我有一个遗留代码,它的缓存实现如下所示:

long lastUpadate;
...

public void checkCach(){

     if(lastUpdated + UPDATE_INTERVAL < System.currentTimeMillis()){
          synchronized(this){
               //cache update goes here
               lastUpdate = System.currentTimeMillis();
          }
     }
}
long lastUpadate;
...
公共无效检查CACH(){
if(lastUpdated+UPDATE_INTERVAL
在多核处理器环境中是否存在这样一个问题:线程不会看到更新的lastUpdate字段,因为它们在同步部分之外检查它(处理器核心缓存的问题)

更新:也可以对该同步块应用重新排序,设置第一个lastUpdate字段,然后才执行缓存更新

在多核处理器环境中,线程是否会出现问题 无法看到更新的lastUpdate字段,因为他们在外部检查它 同步部分的问题(处理器核心缓存的问题)


对。必须同步对共享数据的读取和写入,以确保在多线程环境中的可见性。

如果
lastUpdate
是一个字段变量,请将其设置为
volatile lastUpdate
,以强制所有试图查看其值的线程越过内存屏障。因此,您可以保证无论哪个线程正在读取
lastUpdate
,它们都将获得最新的值。不过要小心,volatile不能保证原子操作