可变可见性

时间:2012-02-27 14:15:42

标签: java caching concurrency

我有遗留代码,其缓存实现如下所示:

long lastUpadate;
...

public void checkCach(){

     if(lastUpdated + UPDATE_INTERVAL < System.currentTimeMillis()){
          synchronized(this){
               //cache update goes here
               lastUpdate = System.currentTimeMillis();
          }
     }
}

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

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

2 个答案:

答案 0 :(得分:1)

  

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

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

答案 1 :(得分:1)

如果lastUpdate是字段变量,则将其设置为volatile lastUpdate以强制所有尝试查看其值的线程穿过内存屏障。因此,您可以保证无论读取lastUpdate的任何线程,它们都将获得最新值。请注意,volatile不能保证原子操作。