java 单例模式

1.饿汉模式,

class Demo{

     private static final Demo demo = new Demo();

     private Demo(){

     }

     public static Demo instance(){

     return demo;

     }

}

2.懒汉模式

class Demo{

    private static final Demo demo;

    private Demo(){

    }

    public static Demo instance(){

    if(demo == null){

        synchronized(this){

            if(demo == null){

                demo = new Demo();

            }

        }

     }

    return demo;

}

}

这种模式可能存在问题

a>A、B线程同时进入了第一个if判断

b>A首先进入synchronized块,由于instance为null,所以它执行instance = new Singleton();

c>由于JVM内部的优化机制,JVM先画出了一些分配给Singleton实例的空白内存,并赋值给instance成员(注意此时JVM没有开始初始化这个实例),然后A离开了synchronized块。

d>B进入synchronized块,由于instance此时不是null,因此它马上离开了synchronized块并将结果返回给调用该方法的程序。

e>此时B线程打算使用Singleton实例,却发现它没有被初始化,于是错误发生了。

3.内部类

class Demo{

    private Demo(){

    }

     private static class Sing(){

        private static final Demo demo = new Demo();

    }

    public static Demo instance(){

        return Sing.demo;

    }

}

你可能感兴趣的:(java 单例模式)