在第一个实例化仍在执行其静态块时实例化一个类

时间:2018-01-29 15:17:52

标签: java

让我们说我在类中有静态块需要5秒才能完成。在此5秒过去之前,将执行同一类的新实例化。在这种情况下会发生什么?第二个实例化是否会延迟,直到第一个实例化完成?静态块是否充当“同步器”?在这种情况下的实例化?两个实例都是并行执行的吗?

Pd积。 请不要开始讨论慢速静态块是否坏。

1 个答案:

答案 0 :(得分:5)

根据https://docs.oracle.com/javase/specs/jls/se9/html/jls-12.html#jls-12.4.2

见第2步:

  

如果C的Class对象表示正在进行初始化   对于某些其他线程的C,然后释放LC并阻止当前   线程,直到通知正在进行初始化   完成后,重复此步骤。

第6步:

  

否则,记录Class对象初始化的事实   C正在由当前线程进行,并释放LC。

     

然后,初始化C的静态字段,它们是常量变量   (§4.12.4,§8.3.2,§9.3.1)。

最后是第9步:

  

接下来,执行类变量初始值设定项和静态   类的初始值设定项,或接口的字段初始值设定项,   按照文字顺序,好像它们只是一个块。

正如您所看到的,如果多个线程需要一次初始化类,则只有其中一个线程可以通过。其他人将等到成功完成其工作。因此,您的5秒静态初始化程序将运行,而另一个线程将在创建实例之前等待它完成。