我觉得我有在Java中volatile
关键字一个不错的主意,但我想重新分解了一些代码,我认为这将是使用它是一个好主意。正确使用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
我可以定义绘图参照挥发性
private volatile HashMap mappings =....;
,然后在get
(或其他地方使用该映射变量)我只想让本地参考副本:
public Data get(ID id)
{
HashMap local = mappings;
//.. look it up using local
}
然后后台线程会加载到临时表中,然后交换r类别中的推理
HashMap tmp;
//load tmp from DB
mappings = tmp;//swap variables forcing write barrier
这种方法是否有意义?它实际上是线程安全的吗?
多数民众赞成在一篇不错的文章,谢谢 – luke 2010-06-10 17:11:18