我覺得我有在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