2012-02-27 46 views
0

我有一个具有缓存实现,看起来像这样的旧代码:可变知名度

long lastUpadate; 
... 

public void checkCach(){ 

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

能有在多核处理器环境问题的线程就不会看到更新LASTUPDATE场,因为他们检查同步部分之外(处理器核心缓存的问题)?

更新:也可以重新排序被应用到该同步块,即第一LASTUPDATE字段将被设置,然后才缓存更新将被执行

回答

1

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

1

可以有在多核处理器环境的问题,即线程 将没有看到更新的lastUpdate字段,因为它们在同步节(处理器核心缓存问题)的 之外检查它?

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