写程序中遇到的,发现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程序块,类加载时间顺序等。谢谢~

解决方案 »

  1.   

    人家说的“static程序块在main函数之前调用”是指同一个类的public class Test {
      static {
        System.out.println("static");
      }
      public static void main(String[] args) {
        System.out.println("main");
      }
    }
      

  2.   

    也就是说,只有类A的static段加载完成,你才能使用A类
      

  3.   

    谢谢shine333。
    我遇到这个问题是之前,我使用的是A类中一个方法aaa(对A的static容器使用了.empty判断以及加载动作)。而这个动作aaa由于是多线程执行,结果偶然发现了一次出错,也就是说在初始这个容器的时候资源冲突了,所以想改成static程序块来实行。
    根据上面的情况
    //X.someFun();这里调用,结果也是一样
    我想,是不是static一定是类加载时候才执行?而类加载的时候是不是一定要执行到使用这个类的程序代码时候才加载,那是否也可能造成资源冲突呢?
      

  4.   

    不会冲突,除非你A本身写的有问题,这个和static加载本身没关系
      

  5.   

    static语句块依附于类,又不属于类,
    当类第一次初始化的时候(先于构造方法)首先开始执行,
    执行结束之后,无论类是否再次初始化都不会执行...
      

  6.   

    补充问一下,如果我的多个线程都正好是执行到使用A.aaa()这个动作的时候,也就是开始执行static代码块。如果其中一个首先到A.aaa()动作,则开始加载A类,那么按这样说就是开始做static动作。
    会不会还出现static动作执行到一半,另外一个线程又开始加载A类,执行static动作,造成static动作里面的资源竞争?
    还是,static动作只会确定执行1次?也就是说第一个线程加载A类,执行static动作即使到一半,另外一个线程就不会来加载A类,只是等待,或者是另外一个线程要加载A类但是不会再次执行static动作。可以看成“加载A类或者执行A类里面的static动作块的时候是线程安全的”?能这样理解么?
      

  7.   

    刚才跟同事讨论了下,也得出一个结论,因为即使多线程,看到的A类static方法中println()打印只有1次,也就是说可以认为A类的加载不管是多少个线程遇到,只由第一个遇到的去触发“加载A、执行A中static”动作,这个动作可以看成是系统级的,不存在资源竞争。
    谢谢楼上各位热心朋友。