如果有两个线程同时调用MyClass.getInstance()方法,就有可能造成MyClass的构造方法被调用两次。
为什么?
因为你没有把他的构造函数私有化。
改成public class MyClass {
private static MyClass _instance;
private MyClass(){}public static MyClass getInstance() {
if(_instance != null) {
_instance = new MyClass();
}
return _instance;
}
} 就不会出现你说的情况了。
为什么?
因为你没有把他的构造函数私有化。
改成public class MyClass {
private static MyClass _instance;
private MyClass(){}public static MyClass getInstance() {
if(_instance != null) {
_instance = new MyClass();
}
return _instance;
}
} 就不会出现你说的情况了。
至于为甚么,其实很简单.
在多线程的情况下, 同时有2个线程调用getInstance方法,在判断 if(_instance != null)的时候2个都成立了.
但是之后其中一个执行了构造方法的调用,另外一个接着也执行了构造方法的调用.于是就产生了你说的这种情况了
例如,线程1刚执行完 if(_instance != null) { 还没有执行_instance = new MyClass();
这时线程2也开始 if(_instance != null),这种情况就会造成实例化两个MyClass对象
还有,是不是static跟是不是线程同步的没有什么必然的联系