You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 05:54:53