java类关于静态域执行过程探索
public class MoreInitializePuzz {
public static void main(String[] args) {
/**
* 问题 0+ .. + 99 ==4550
* 程序结果: 9900
* 原因: 类初始化顺序问题:
* 1. 初始化MoreInitializeddPuzz类, jvm调用main方法
* 2. Cached.getSum(), 需要先初始化Cached类,
* 3. Cached在加载类的时候会先执行一次静态块,执行一次initializeIfNecessary()方法
* 4. 这时候,initialized =false(这时候是系统默认设置的参数), sum=0 , 执行完成后, initialized=true, sum=4550
* 以下是出现问题的原因
* 5. 静态块执行完成后, 执行 initialized = false, 静态执行器重新给initialized赋值为false
* 6. 从而完成Cached的初始化. 但现在 问题是sum=4550;initialized=false
* 7. 执行Cached.getSum() 方法.
*
* 总结: 静态块执行: 1 顺序初始化,设默认值, 2 调用静态执行器对静态域赋值.
* 需要考虑重复赋值和赋值前调用问题
*
*
*
*/
System.out.println(Cached.getSum());
}
}
class Cached{
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;
}
}
}