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不能保证原子操作