Wildfly/JBoss中模块内静态变量的差异化行为机制探究
WildFly/JBoss中静态变量实例共享差异的原理解析
现象回顾
- 静态变量定义在WildFly/JBoss模块内的JAR中:所有引用该模块的WAR应用共享同一个静态变量实例
- 静态变量位于每个WAR内部的JAR中:每个WAR应用拥有独立的静态变量实例
核心原理:类加载器的隔离与共享机制
Java中静态变量的"单例"特性并非JVM全局,而是由加载该类的类加载器+类本身共同决定——同一个类加载器加载的同一个类,静态变量仅存在一个实例;不同类加载器加载的同名类,会被JVM视为完全不同的Class对象,各自拥有独立的静态变量空间。
WildFly/JBoss的类加载架构基于JBoss Modules,正是这种架构导致了上述差异:
- 模块内JAR的类加载:
WildFly的模块是全局共享的资源,每个模块只会被加载一次,对应一个全局唯一的模块类加载器。所有引用该模块的WAR应用,都会使用这个全局类加载器来加载模块内的类。因此,模块内类的静态变量只会被初始化一次,所有WAR共用同一个实例。 - WAR内部JAR的类加载:
每个WAR应用都拥有自己专属的WAR类加载器,属于该WAR内部的JAR会被这个专属类加载器独立加载。哪怕是完全相同的JAR文件,被不同WAR的类加载器加载后,对应的类会被视为不同的Class实例,各自的静态变量自然相互独立。
误区纠正
很多开发者误以为Java静态变量是JVM全局单例,实际上这个认知忽略了类加载器的影响——只有当类被同一个类加载器加载时,静态变量才是单例;跨类加载器的场景下,静态变量的实例完全独立。
内容的提问来源于stack exchange,提问作者Heath Morgan
相关产品推荐
相关产品推荐

