单例模式

1.介绍

  1.单例类只能有一个实例

  2.单例类必须自己创建自己的实例

  3.单例类必须提供外界获取这个实例的方法

2.设计思想

  1.外界不能创建这个类的实例,那么必须将构造器私有化

  2.单例类必须自己创建自己的实例,不能允许在类的外部修改内部创建的实例,所以将这个实例用 private 声明。为了外界能访问到这个实例,我们还必须提供 get 方法得到这个实例。因为外界不能 new 这个类,

所以我们必须用 static 来修饰字段和方法

3.创建单例模式

  1.恶汉模式(synchronized 加一把锁)

public class SingletonA {
    private SingletonA(){}

    private static SingletonA singletonA=new SingletonA();

    public static SingletonA getSingletonA(){
        return singletonA;
    }
}

  2.双重检测机制(DCL)懒汉式

  3.静态内部类懒汉式(推荐)

  • 还可以使用静态内部类这种巧妙的方式来实现单例模式!它的原理是这样的:

    • 当任何一个线程第一次调用getInstance()时,都会使SingletonHolder被加载和被初始化,此时静态初始化器将执行Singleton的初始化操作。(被调用时才进行初始化!)

    • 初始化静态数据时,Java提供了的线程安全性保证。(所以不需要任何的同步)

public class Java3y {
    private Java3y() {
    }
    // 使用内部类的方式来实现懒加载
    private static class LazyHolder {
        // 创建单例对象
        private static final Java3y INSTANCE = new Java3y();
    }
​
    // 获取对象
    public static final Java3y getInstance() {
        return LazyHolder.INSTANCE;
    }
}
  • 4.枚举(推荐)

    枚举的方式实现:

    • 简单,直接写就行了

    • 防止多次实例化,即使是在面对复杂的序列化或者反射攻击的时候(安全)!

posted @ 2019-12-12 11:24  huiyii  阅读(115)  评论(0编辑  收藏  举报