我有一个缓存,该缓存是使用Simeple HashMap实现的。喜欢 -
HashMap cache = new HashMap();
大部分时间都使用此缓存从中读取值。我有另一个重新加载缓存的方法,在这个方法的内部,我基本上创建了一个新的缓存,然后分配了引用。据我了解,对象引用的分配是Java中的Atomic。
public class myClass {
private HashMap cache = null;
public void init() {
refreshCache();
}
// this method can be called occasionally to update the cache.
public void refreshCache() {
HashMap newcache = new HashMap();
// code to fill up the new cache
// and then finally
cache = newcache; //assign the old cache to the new one in Atomic way
}
}
我了解,如果我不将缓存声明为易失性,则其他线程将无法看到更改,但是对于我的用例而言,将缓存中的更改传播到其他线程不是时间紧迫的,它们可以继续使用旧缓存延长时间。
您看到任何线程问题吗?考虑到许多线程正在从高速缓存中读取数据,并且仅在重新加载高速缓存时才读取。
编辑-我的主要困惑是我不必在这里使用AtomicReference,因为赋值操作本身是原子的?
编辑-
我知道要使排序正确,我应该将缓存标记为易失性。但是,如果将refreshCache方法标记为已同步,则不必使高速缓存为易失性,因为已同步块将同时处理顺序和可见性?