一、单例模式


 

1.1单例模式的八种方式

1)饿汉式(静态常量)

2)饿汉式(静态代码块)

3)懒汉式(线程不安全)

4)懒汉式 (线程安全,同步方法)

5)懒汉式(线程安全,同步代码块)

6)双重检查

7)静态内部类

8)枚举

1.1.1 饿汉式(静态常量)

饿汉式的创建是这样的,先给一个私有的构造方法,目的是不能在其他类中创建该对象

在类初始化的时候就创建对象

提供对外调用的方法

public class Singledemo {

    public static void main(String[] args) {
        //获取实例
        Singledemo singleInstance = Singledemo.getSingleInstance();
    }

    //提供私有的构造方法
    private Singledemo() {
        System.out.println("创建了一个单例实例");
    }

    //在类初始化的时候就创建对象
    private static Singledemo singleInstance = new Singledemo();

    //提供对外的调用方法

    public static Singledemo getSingleInstance(){
        return singleInstance;
    }
}

 总结:该方式比较简单,在类装载的时候就完成了实例化,避免了多线程同步问题

 缺点: 在类装载的时候就实例化,如果一直没有用这个类的话,就造成了内存的浪费

1.1.2 饿汉式(静态代码块)

public class Singledemo2 {

    //私有化构造方法
    private Singledemo2(){

    }

    //定义私有的静态变量
    private static Singledemo2 singledemo2;

    //静态代码块中创建对象
    static {
        singledemo2=new Singledemo2();
    }
    //提供公有的方法获取实例
    public Singledemo2 getSingledemo2(){
        return singledemo2;
    }
}

 1.1.3懒汉式(线程不安全)

创建方式是这样的:

给一个私有的构造方法,使不能新建这个类

定义一个静态变量,先不创建对象

定义一个公有的方法,用来获取实例,在方法中判断实例是否为null,为null的时候new一个新的对象

public class SingleDemo3 {
    public static void main(String[] args) {
        SingleDemo3 singleDemo3 = SingleDemo3.getSingleDemo3();
    }
    //提供私有的静态方法
    private SingleDemo3(){
        System.out.println("等调用方法的时候,我创建了一个实例");
    }
    //提供静态变量
    private static SingleDemo3 singleDemo3;

    //提供共有的获取实例的方法
    public static SingleDemo3 getSingleDemo3(){
        if (singleDemo3==null){
            singleDemo3=new SingleDemo3();
        }
        return singleDemo3;
    }
}

 

优点:在使用的时候创建对象,避免了内存浪费的危险

缺点:这种创建方法线程不安全

 

版权声明:本文为anyanpeng原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/anyanpeng/p/15038052.html