下面的類計算并緩存了一個總和,并且在另一個類中打印這個總和
class Cache{
static {
initializeIfNecessary();
}
private static int sum;
public static int getSum(){
initializeIfNecessary();
return sum;
}
private static boolean initialized = false;
private static synchronized void initializeIfNecessary(){
if(!initialized){
for(int i=0; i < 100; i++ )
sum+=i;
initialized = true;
}
}
}
pubic class Client {
pubilc static void main(String[] args){
System.out.println(Cache.getSum());
}
}
程序是一個典型的半開循環,應該打印出1到99的整數總和,即4950,但程序運行打印的為9900,是預期值的兩倍。
程序在確保sum在使用之前就已經初始化這個問題上,遇到了麻煩。程序結合了惰性初始化和積極初始化,還使用上了同步,以確保緩存在多線程環境下也能工作,但程序無法完成預期的工作。
程序輸出打印是控制標志initialized 的問題。qq上一個朋友問的一本書里的問題,我也找到那本書了,是惰性初始化(static初始化)的問題,控制標志在static完成初始化后又重新被構造器賦值為false,初始化總和值的方法被執行了兩次。
posted on 2007-09-06 09:58
皇馬嘯西風 閱讀(219)
評論(1) 編輯 收藏