如果有两个线程同时调用MyClass.getInstance()方法,就有可能造成MyClass的构造方法被调用两次。 
为什么?
 
因为你没有把他的构造函数私有化。
改成public class MyClass { 
private static MyClass _instance; 
private MyClass(){}public static MyClass getInstance() { 
 if(_instance != null) { 
  _instance = new MyClass(); 
  } 
return _instance; 
  } 
} 就不会出现你说的情况了。

解决方案 »

  1.   

    你的getInstance()方法如果加上同步就不会出现你说的2吃调用构造方法的情况了.
    至于为甚么,其实很简单.
    在多线程的情况下, 同时有2个线程调用getInstance方法,在判断 if(_instance != null)的时候2个都成立了.
    但是之后其中一个执行了构造方法的调用,另外一个接着也执行了构造方法的调用.于是就产生了你说的这种情况了
      

  2.   

    不对啊.这里的判断应该是 if(_instance == null)而不是!=吧.
      

  3.   

    额。是== ,但是instance的值是static的啊。我感觉还是最终得到一个实例呢?在一个如果一个变量是static的话,两个线程可以同时访问该变量吗?
      

  4.   

    因为getInstance方法不是同步的,所以有可能多个线程同时进入该方法
    例如,线程1刚执行完 if(_instance != null) { 还没有执行_instance = new MyClass();
    这时线程2也开始 if(_instance != null),这种情况就会造成实例化两个MyClass对象
      

  5.   

    如果一个变量是static的话,两个线程可以同时访问该变量吗?也就是说static变量是线程同步的吗?
      

  6.   

    这句话本身就有毛病,既然可以多个线程同时访问,那就不是线程同步的
    还有,是不是static跟是不是线程同步的没有什么必然的联系