我认为我对 java 中的关键字有一个很好的想法volatile
,但我正在考虑重构一些代码,我认为使用它是一个好主意。
我有一个基本上用作数据库缓存的类。它拥有一堆从数据库中读取的对象,为这些对象提供请求,然后偶尔刷新数据库(基于超时)。这是骨架
public class Cache
{
private HashMap mappings =....;
private long last_update_time;
private void loadMappingsFromDB()
{
//....
}
private void checkLoad()
{
if(System.currentTimeMillis() - last_update_time > TIMEOUT)
loadMappingsFromDB();
}
public Data get(ID id)
{
checkLoad();
//.. look it up
}
}
所以担心 loadMappingsFromDB 可能是一个高延迟操作,这是不可接受的,所以最初我认为我可以在缓存启动时启动一个线程,然后让它休眠,然后在后台更新缓存。但后来我需要同步我的班级(或地图)。然后我只是为了让每个缓存访问变慢而偶尔暂停一下。
然后我想为什么不使用volatile
我可以将地图参考定义为 volatile
private volatile HashMap mappings =....;
然后在get
(或使用映射变量的任何其他地方)我将只制作引用的本地副本:
public Data get(ID id)
{
HashMap local = mappings;
//.. look it up using local
}
然后后台线程将加载到临时表中,然后交换类中的引用
HashMap tmp;
//load tmp from DB
mappings = tmp;//swap variables forcing write barrier
这种方法有意义吗?它实际上是线程安全的吗?