Singleton类中的实例变量初始化

时间:2015-02-24 09:42:55

标签: java singleton

我有一个简单的单身类:

public class MySingleton {
  private MyManager mManager;
  private static MySingleton mInstance;

  private MySingleton() {
  }

  public static MySingleton getInstance() {
     if (mInstance == null) {
        mInstance = new MySingleton();
     }
     return mInstance;
  }

  public MyManager getManagerByName(String name) {
     //I don’t show the GET_MGR function, it is a 3rd party library function
     mManager = GET_MGR(name); 
  }

  public void doTask() {
     mManager.startTask();
  }

}

然后,在另一个A类中,我执行代码:

String name = “John”;
MyManager mgr = MySingleton.getInstance().getManagerByName(name);

上面的代码工作正常。

在另一个B类中,我执行代码:

MySingleton.getInstance().doTask();

上面的代码抛出 NullPointerException ,而mManager在doTask()中为null。

为什么呢?我的意思是它是单身,如果我已经在A类中获得mManager MySingleton.getInstance().getManagerByName(name);,则单个实例应该已经初始化mManager。为什么在B类中执行时mManager为空?

我不想从构造函数初始化mManager,如何解决这个问题?

======更新====

我仔细检查,顺序是正确的,A类中的代码总是在B类代码之前运行。但是我意识到A类中的代码在不同的进程中运行。我用上面的代码模拟我的真实项目,所以实际上,A和B类必须在不同的进程中运行。所以,有人说过,我怎么能解决这个问题?

2 个答案:

答案 0 :(得分:0)

代码应该按照您的意图运行。我怀疑你的问题中没有包含其他错误。

据推测,你得到了混乱的行动顺序,即

MySingleton.getInstance().doTask();

之前执行
MySingleton.getInstance().getManagerByName(name);

更新:我试用了您的代码,工作正常:http://ideone.com/a7BULg

更新2:

  

但我意识到A类中的代码在不同的进程中运行。这可能是真正的原因吗?

如果你通过不同的过程意味着一个不同的JVM,那么是的,这肯定是问题所在。单例的范围在JVM中。两个JVM =两个单例实例。

答案 1 :(得分:0)

GET_MGR(name)也可以返回null。