2012-02-27 63 views
0

我有一個具有緩存實現,看起來像這樣的舊代碼:可變知名度

long lastUpadate; 
... 

public void checkCach(){ 

    if(lastUpdated + UPDATE_INTERVAL < System.currentTimeMillis()){ 
      synchronized(this){ 
       //cache update goes here 
       lastUpdate = System.currentTimeMillis(); 
      } 
    } 
} 

能有在多核處理器環境問題的線程就不會看到更新LASTUPDATE場,因爲他們檢查同步部分之外(處理器核心緩存的問題)?

更新:也可以重新排序被應用到該同步塊,即第一LASTUPDATE字段將被設置,然後才緩存更新將被執行

回答

1

如果lastUpdate是一個字段變量,將其設置爲volatile lastUpdate以強制所有線程試圖查看其值以越過內存障礙。因此,您可以保證無論線程正在讀取lastUpdate,他們將獲得最新的值。當心,揮發性不能保證原子操作。

1

可以有在多核處理器環境的問題,即線程 將沒有看到更新的lastUpdate字段,因爲它們在同步節(處理器核心緩存問題)的 之外檢查它?

是的。 對共享數據的讀寫必須進行同步以確保在多線程環境中可見。