Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在第一个实例化仍在执行其静态块时实例化类_Java - Fatal编程技术网

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

Java 在第一个实例化仍在执行其静态块时实例化类,java,Java,假设我在一个需要5秒才能完成的类中有一个静态块。在这5秒钟过去之前,将执行同一类的新实例化。在这种情况下会发生什么?第二次实例化是否延迟到第一次实例化完成?在这种情况下,静态块是否充当实例化的“同步器”?这两个实例化是并行执行的吗 医生。 请不要开始讨论慢速静态块是否有害。根据 见第2步: 如果C的类对象指示正在进行初始化 对于C,通过其他线程,然后释放LC并阻塞电流 线程,直到通知正在进行的初始化已完成 已完成,此时重复此步骤 和步骤6: 否则,记录初始化类对象 C正在由当前线程进行,并释放L

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

医生。 请不要开始讨论慢速静态块是否有害。

根据

见第2步:

如果C的类对象指示正在进行初始化 对于C,通过其他线程,然后释放LC并阻塞电流 线程,直到通知正在进行的初始化已完成 已完成,此时重复此步骤

和步骤6:

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

然后,初始化C的静态字段,这些字段是常量变量 (§4.12.4、§8.3.2、§9.3.1)

最后,第9步:

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


如您所见,如果多个线程需要同时初始化该类,则只有一个线程能够通过。其他人将等待成功者完成工作。因此,您的5秒静态初始值设定项将运行,而另一个线程将在创建实例之前等待它完成。

“静态块是否充当实例化的“同步器”在这种情况下”是的,静态块是同步的(至少在每个类装入器中)。Java静态初始值设定项是线程安全的。看见