why?懒汉模式中线程不安全指的是多个线程来读取这个static变量时,会使得这个static指向的实例对象发生改变,而不是static变量本身创建了多次。在Java中,static变量在JVM中只有一份拷贝,只分配一次内存。
举个例子:
A线程在调用单例的懒汉模式时,因为static变量指向为null,所以会去创建该类的一个实例a,然后让static指向它;但如果不是线程安全的,这时候B线程如果也来调用,A的操作此时没有结束,static变量判断还是null,那么B会去创建该类的另一个实例b,因此实际上该类的实例在JVM中就会有2个,不符合单例模式的规定。但这个static变量在JVM中还是只有一份拷贝,只分配一个内存,至于指向的是a,还是b,要看A、B两个线程的推进顺序。

解决方案 »

  1.   

    static变量都是一个。至于懒汉模式是由于多线程导致new出来了两个(或多个)不同的实例,由于出现多个,静态变量引用只是指向不同的实例,static变量的空间还是在原来那里,只是引用值变了。
    而且感觉楼主对懒汉模式有些误解,单例就是要求只能new出一个对象,所有线程getInstance只能得到同一个对象。而懒汉模式的线程不安全会导致new出多个对象,使得不同线程拿到不同的对象引用,故违背了单例的要求。
      

  2.   

    多线程的单例模式怎么会造成两个实例。 要是有多个实例,就说明你的单例代码有BUG。 多实例还能叫单例模式么。。
      

  3.   

    多线程的单例模式怎么会造成两个实例。 要是有多个实例,就说明你的单例代码有BUG。 多实例还能叫单例模式么。。
    我是说没加同步啦JAVA里写单例模式有两种方法,其中有一种方法要加同步,要不可能会(注意是可能,两个线程同时运行创建 )出现两个实例。有兴趣自己百度下吧,确实是这样的。。
      

  4.   

    多线程的单例模式怎么会造成两个实例。 要是有多个实例,就说明你的单例代码有BUG。 多实例还能叫单例模式么。。
    我是说没加同步啦JAVA里写单例模式有两种方法,其中有一种方法要加同步,要不可能会(注意是可能,两个线程同时运行创建 )出现两个实例。有兴趣自己百度下吧,确实是这样的。。
    如果你的方法能出现2个实例,那就不叫单例。
    是单例懒加载你就得保证线程安全。
    讨论的是单例这个设计模式不会出现多个实例,有多个实例的就不是单例
      

  5.   

    多线程的单例模式怎么会造成两个实例。 要是有多个实例,就说明你的单例代码有BUG。 多实例还能叫单例模式么。。
    我是说没加同步啦JAVA里写单例模式有两种方法,其中有一种方法要加同步,要不可能会(注意是可能,两个线程同时运行创建 )出现两个实例。有兴趣自己百度下吧,确实是这样的。。
    如果你的方法能出现2个实例,那就不叫单例。
    是单例懒加载你就得保证线程安全。
    讨论的是单例这个设计模式不会出现多个实例,有多个实例的就不是单例
    额,是的是的,单例我知道的,线程同步我也知道,就只是说这个问题的。