From f6a41b9696787a89f179499e8004b7bc70c72be8 Mon Sep 17 00:00:00 2001 From: vcjmhg Date: Wed, 14 Apr 2021 15:45:17 +0800 Subject: [PATCH] =?UTF-8?q?=E6=AD=A4=E5=A4=84=E7=9A=84=E6=AD=BB=E9=94=81?= =?UTF-8?q?=E6=94=B9=E6=88=90=E8=BF=9B=E7=A8=8B=E9=98=BB=E5=A1=9E=E6=98=AF?= =?UTF-8?q?=E5=90=A6=E4=BC=9A=E6=9B=B4=E5=A5=BD=E5=91=A2=EF=BC=9F=EF=BC=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 此处按照周志明老师《深入理解JVM虚拟机》第三版第七章虚拟机类的加载机制P279页的描述,此处可能会有的问题如果`()`方法中有耗时很长的操作,其他进程由于无法获得锁会进入阻塞队列中一直等待。而死锁的定义是**指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。** 而这里如果只是耗时时间过长的话并不会进入死锁,而是长时间处于阻塞队列中,耗时操作执行完成后,其他进程还是会正常执行下去。 所以这里使用进程阻塞是否会更好呢?? --- docs/java/jvm/类加载过程.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/java/jvm/类加载过程.md b/docs/java/jvm/类加载过程.md index cd04e42a..e3369879 100644 --- a/docs/java/jvm/类加载过程.md +++ b/docs/java/jvm/类加载过程.md @@ -70,7 +70,7 @@ Class 文件需要加载到虚拟机中之后才能运行和使用,那么虚 初始化是类加载的最后一步,也是真正执行类中定义的 Java 程序代码(字节码),初始化阶段是执行初始化方法 ` ()`方法的过程。 -对于` ()` 方法的调用,虚拟机会自己确保其在多线程环境中的安全性。因为 ` ()` 方法是带锁线程安全,所以在多线程环境下进行类初始化的话可能会引起死锁,并且这种死锁很难被发现。 +对于` ()` 方法的调用,虚拟机会自己确保其在多线程环境中的安全性。因为 ` ()` 方法是带锁线程安全,所以在多线程环境下进行类初始化的话可能会引起多个进程阻塞,并且这种阻塞很难被发现。 对于初始化阶段,虚拟机严格规范了有且只有5种情况下,必须对类进行初始化(只有主动去使用类才会初始化类):