Java static变量修改后未同步问题咨询
关于Java static变量修改后未共享的问题
我是Java新手,正在学习static关键字。我在Eclipse中创建了drinks包,编写了如下代码:
package drinks; public class Dairy { public static Dairy dairyclssobj = null; private Dairy(){} public static Dairy getDairy() { if (dairyclssobj==null) { dairyclssobj = new Dairy(); return dairyclssobj; } return dairyclssobj; } static String brandname = " oompaa..lumpaa..Drinks"; public static void main(String[] args) { System.out.println(brandname); } } class Chocolateee { public static void main(String[] args) { Dairy.brandname = "..Yum Drinks"; System.out.println("The brand name now is " + Dairy.brandname); } } class Chocolate1 { static String bnameString = Dairy.brandname; public static void main(String[] args) { System.out.println("The brand name now is " + bnameString); } }
我按顺序运行Dairy、Chocolateee、Chocolate1三个类,输出结果为:Dairy类输出"oompaa..lumpaa..Drinks",Chocolateee类输出"..Yum Drinks",但Chocolate1类仍输出初始值"oompaa..lumpaa..Drinks"。即使将Dairy类设计为单例模式,结果依然如此。我疑惑:static变量应在对象间共享,修改后所有类都应看到新值,为何出现此情况?是否运行方式有误?
问题原因
核心问题在于你每次运行一个类时,都是启动了一个独立的JVM进程:
- 运行Dairy类:新JVM启动,加载Dairy类,
brandname初始化默认值,输出后进程终止。 - 运行Chocolateee类:又是一个全新的JVM,重新加载Dairy类,
brandname回到初始值,修改后输出,进程终止。 - 运行Chocolate1类:再次启动新JVM,Dairy类重新加载,
brandname还是初始值,而Chocolate1的bnameString是在类加载时就赋值为这个初始值,自然输出初始内容。
单例模式在此场景没用,因为单例只保证同一个JVM进程内只有一个实例,不同进程的类完全是独立加载的,static变量不会跨进程共享。
正确做法
要看到static变量的共享效果,必须把所有逻辑放到同一个JVM进程里执行。比如把三个类的逻辑合并到一个main方法中:
package drinks; public class Dairy { public static Dairy dairyclssobj = null; private Dairy(){} public static Dairy getDairy() { if (dairyclssobj==null) { dairyclssobj = new Dairy(); return dairyclssobj; } return dairyclssobj; } static String brandname = " oompaa..lumpaa..Drinks"; public static void main(String[] args) { // 原Dairy类的逻辑 System.out.println(brandname); // 原Chocolateee类的逻辑 Dairy.brandname = "..Yum Drinks"; System.out.println("The brand name now is " + Dairy.brandname); // 原Chocolate1类的逻辑 String bnameString = Dairy.brandname; System.out.println("The brand name now is " + bnameString); } }
运行这个类,就能看到brandname修改后被共享的效果:
oompaa..lumpaa..Drinks The brand name now is ..Yum Drinks The brand name now is ..Yum Drinks
内容的提问来源于stack exchange,提问作者Gunjan
相关产品推荐
相关产品推荐

