让我们说我在类中有静态块需要5秒才能完成。在此5秒过去之前,将执行同一类的新实例化。在这种情况下会发生什么?第二个实例化是否会延迟,直到第一个实例化完成?静态块是否充当“同步器”?在这种情况下的实例化?两个实例都是并行执行的吗?
Pd积。 请不要开始讨论慢速静态块是否坏。
答案 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秒静态初始化程序将运行,而另一个线程将在创建实例之前等待它完成。