Java静态代码块默认只执行一次,即在类初始化阶段由同一类加载器加载且未卸载时仅运行一次;触发条件包括new实例、调用静态方法、访问非final静态字段等,多线程下JVM保证线程安全,类卸载或不同类加载器会导致重复执行。

Java 中静态代码块**默认情况下不会被多次触发执行**,它在类的初始化阶段(Initialization Phase)仅执行一次,前提是该类由同一个类加载器加载且未被卸载。
什么情况下只执行一次
静态代码块被设计为类级别的初始化逻辑,JVM 通过内部标记确保其仅运行一次。以下情况均不会导致重复执行:
- 创建多个对象(new Test() 调用一百次)
- 反复调用静态方法(如 Test.doInit())
- 多次读写非 final 的静态字段(如 Test.count++)
- 反射获取 Class 对象(Test.class 或 Class.forName("Test"),若已初始化则不触发)
什么情况下会“再次执行”
看似重复,实则是 JVM 加载了“另一个类”——关键在于类加载器隔离或类卸载:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 使用不同的类加载器(如自定义 ClassLoader)多次加载同名类,每个加载器实例都会独立执行其 static 块
- 在支持热部署的环境(如某些 Web 容器、Spring Boot DevTools、OSGi)中,旧类被卸载、新类被重新加载,此时 <clinit> 会再次运行
- 显式通过字节码重定义(如 Instrumentation + redefineClasses)并配合类卸载机制(极少见)
多线程下是否安全
是线程安全的。当多个线程首次同时触发类初始化时,JVM 会阻塞其余线程,仅允许一个线程执行静态代码块,其他线程等待初始化完成后再继续。整个过程由 JVM 底层保证原子性。
立即学习“Java免费学习笔记(深入)”;
和哪些行为容易混淆
注意区分以下常见误解:
- 实例初始化块({ ... }):每次 new 对象都执行,与 static 块无关
- final static 编译期常量(如 public static final int VERSION = 1;):引用它不会触发类初始化,static 块也不会因此运行
- 子类初始化:会触发父类初始化(若尚未发生),但父类 static 块仍只执行一次

















