我有一个简单的单身类:
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类必须在不同的进程中运行。所以,有人说过,我怎么能解决这个问题?
答案 0 :(得分:0)
代码应该按照您的意图运行。我怀疑你的问题中没有包含其他错误。
据推测,你得到了混乱的行动顺序,即
MySingleton.getInstance().doTask();
在
之前执行MySingleton.getInstance().getManagerByName(name);
更新:我试用了您的代码,工作正常:http://ideone.com/a7BULg
更新2:
但我意识到A类中的代码在不同的进程中运行。这可能是真正的原因吗?
如果你通过不同的过程意味着一个不同的JVM,那么是的,这肯定是问题所在。单例的范围在JVM中。两个JVM =两个单例实例。
答案 1 :(得分:0)
GET_MGR(name)也可以返回null。