写程序中遇到的,发现static程序块并没有在main函数之前调用。我的static程序块是在X类中写的,有println()打印输出。public static void main(String[] _s) {
MyClass myclass = new MyClass();
myclass.load();//这里如果因为其他原因执行了Exit(1)动作,则看不到X类的static程序块println动作。
myclass.go();//go动作放出的线程中有使用到X类的动作
//X.someFun();这里调用,结果也是一样,
}查了网上的资料,有说static程序块是在main函数之前执行,但看这个结果并不是这样。又有说是static程序块是在该类被加载的时候首先执行。但我后面加了X.someFun()的动作,只要前面Exit(1)退出了,依然看不到static动作的执行。那么表明虽然我这个程序用到了X类,但程序没有走到那里的时候,就不会加载X类,也就不会执行static动作么?
求解惑,关于static程序块,类加载时间顺序等。谢谢~
MyClass myclass = new MyClass();
myclass.load();//这里如果因为其他原因执行了Exit(1)动作,则看不到X类的static程序块println动作。
myclass.go();//go动作放出的线程中有使用到X类的动作
//X.someFun();这里调用,结果也是一样,
}查了网上的资料,有说static程序块是在main函数之前执行,但看这个结果并不是这样。又有说是static程序块是在该类被加载的时候首先执行。但我后面加了X.someFun()的动作,只要前面Exit(1)退出了,依然看不到static动作的执行。那么表明虽然我这个程序用到了X类,但程序没有走到那里的时候,就不会加载X类,也就不会执行static动作么?
求解惑,关于static程序块,类加载时间顺序等。谢谢~
static {
System.out.println("static");
}
public static void main(String[] args) {
System.out.println("main");
}
}
我遇到这个问题是之前,我使用的是A类中一个方法aaa(对A的static容器使用了.empty判断以及加载动作)。而这个动作aaa由于是多线程执行,结果偶然发现了一次出错,也就是说在初始这个容器的时候资源冲突了,所以想改成static程序块来实行。
根据上面的情况
//X.someFun();这里调用,结果也是一样
我想,是不是static一定是类加载时候才执行?而类加载的时候是不是一定要执行到使用这个类的程序代码时候才加载,那是否也可能造成资源冲突呢?
当类第一次初始化的时候(先于构造方法)首先开始执行,
执行结束之后,无论类是否再次初始化都不会执行...
会不会还出现static动作执行到一半,另外一个线程又开始加载A类,执行static动作,造成static动作里面的资源竞争?
还是,static动作只会确定执行1次?也就是说第一个线程加载A类,执行static动作即使到一半,另外一个线程就不会来加载A类,只是等待,或者是另外一个线程要加载A类但是不会再次执行static动作。可以看成“加载A类或者执行A类里面的static动作块的时候是线程安全的”?能这样理解么?
谢谢楼上各位热心朋友。