下面的类计算并缓存了一个总和,并且在另一个类中打印这个总和
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
皇马啸西风 阅读(212)
评论(1) 编辑 收藏