单例模式

2021-01-13  本文已影响0人  mua马

单例的四大原则:

1.构造私有。
2.以静态方法或者枚举返回实例。
3.确保实例只有一个,尤其是多线程环境。
4.确保反序列化时不会重新构建对象。

单例的五种实现

一、饿汉式

    private static SingleTon INSTANCE = new SingleTon();

    private SingleTon() {
    }

    public static SingleTon getInstance() {
        return INSTANCE;
    }
}

优点:线程安全
缺点:浪费空间

二、懒汉式

public class SingleTon {
    private static SingleTon INSTANCE;

    private SingleTon() {
    }

    public static SingleTon getInstance() {
        if (INSTANCE == null) {
            INSTANCE = new SingleTon();
        }
        return INSTANCE;
    }
}

优点:延迟加载,节省空间
缺点:不是线程安全的

三、静态内部类

public class SingleTon {
    
    private SingleTon() {
    }

    public static SingleTon getInstance() {
        return SingleTonHolder.INSTANCE;
    }

    private static class SingleTonHolder {
        private static SingleTon INSTANCE = new SingleTon();
    }
}

优点:延迟加载,线程安全
缺点:不能传参

四、双重校验锁(Double Check Lock)

public class SingleTon {
    private static volatile SingleTon INSTANCE;

    private SingleTon() {
    }

    public static SingleTon getInstance() {
        if (INSTANCE == null) {
            synchronized (SingleTon.class) {
                if (INSTANCE == null) {
                    INSTANCE = new SingleTon();
                }
            }
        }
        return INSTANCE;
    }
}

优点:延迟加载,线程安全,可传参
缺点:volatile会稍微影响性能,在这里的作用是禁止指令重排序
Java volatile关键字最全总结:原理剖析与实例讲解(简单易懂)
volatile关键字在Android中到底有什么用?

五、枚举

enum SingleTon {
    INSTANCE;

    void method() {

    }
}

优点:线程安全,代码简单
缺点:不能传参,不能延时加载

结论:推荐第三种 DCL方式

上一篇 下一篇

猜你喜欢

热点阅读