欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

实战java设计模式--单例模式

程序员文章站 2022-05-04 23:06:06
目录1 介绍2 实现方式2.1 饿汉式(静态变量)2.2 饿汉式(静态代码块)2.3 懒汉式(线程不安全)2.4 懒汉式(线程安全)2.5 双重校验锁2.6 静态内部类方式2.7 枚举方式3 总结1 介绍单例模式属于创建型模式。单例模式创建的单例类只能有一个实例,并且是自己创建自己的唯一实例。使用场景:整个项目的配置类、项目的工具类等等。2 实现方式实现关键步骤:构造器私有化;(不让别人new)持有一个自己类型的引用;(怎么创建按照具体方法来)返回一个具体实例的方法;(给别人使用)同时...

1 介绍

单例模式属于创建型模式。单例模式创建的单例类只能有一个实例,并且是自己创建自己的唯一实例。
使用场景:整个项目的配置类、项目的工具类等等。

2 实现方式

实现关键步骤:

  • 构造器私有化;(不让别人new)
  • 持有一个自己类型的引用;(怎么创建按照具体方法来)
  • 返回一个具体实例的方法;(给别人使用)

同时关注两个问题:是否线程安全?是否支持懒加载?

2.1 饿汉式(静态变量)

//饿汉式
class Singleton{
    //1.构造器私有化,别人不能new
    private Singleton(){};
    //2.本类内部创建对象实例
    private final static Singleton instance = new Singleton();
    //3. 提供一个共有的静态方法按返回实例
    public static Singleton getInstance(){
        return instance;
    }
}

类加载时就初始化。
是否线程安全:是
是否支持懒加载:否

2.2 饿汉式(静态代码块)

//饿汉式(静态代码块)
class Singleton{
    //私有变量
    private static Singleton instance;
    //1.构造器私有化,别人不能new
    private Singleton(){}
    //2.静态代码代码块里面创建
    static {
        instance=new Singleton();
    }
    //3. 提供一个共有的静态方法按返回实例
    public static Singleton getInstance(){
        return instance;
    }
}

类加载时就初始化。
是否线程安全:是
是否支持懒加载:否

2.3 懒汉式(线程不安全)

//懒汉式(线程不安全)
class Singleton {
    //私有变量
    private static Singleton instance;
    //1.构造器私有化,别人不能new
    private Singleton() {
    }
    //2. 提供一个共有的静态方法按返回实例
    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

是否线程安全:否
是否支持懒加载:是

2.4 懒汉式(线程安全)

//懒汉式(线程安全)
class Singleton {
    //私有变量
    private static Singleton instance;
    //1.构造器私有化,别人不能new
    private Singleton() {
    }
    //2. 提供一个共有的静态方法按返回实例
    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

在获得实例函数上加锁。
是否线程安全:是
是否支持懒加载:是

2.5 双重校验锁

懒汉式(线程安全)的方式虽然可线程安全,但是这样加锁效率较低。

//双重校验锁
class Singleton {
    //私有变量
    private static volatile Singleton instance;//注意关键字volatile
    //1.构造器私有化,别人不能new
    private Singleton() {
    }
    //2. 提供一个共有的静态方法按返回实例
    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

双重校验体现在双重判断是否为空。
是否线程安全:是
是否支持懒加载:是

2.6 静态内部类方式

//静态内部类方式
class Singleton {
    //1.构造器私有化,别人不能new
    private Singleton() {
    }
    //2.静态内部类
    private static class SingleInstance{
        private static final Singleton INSTANCE=new Singleton();
    }
    //3. 提供一个共有的静态方法按返回实例
    public static synchronized Singleton getInstance() {
        return SingleInstance.INSTANCE;
    }
}

在getInstance调用时才加载SingleInstance类。
是否线程安全:是
是否支持懒加载:是

2.7 枚举方式

//枚举方式
enum Singleton {
    INSTANCE;
    public void whateverMethod() {
        System.out.println("ok!");
    }
}

jdk 1.5之后才支持
是否线程安全:是
是否支持懒加载:否

3 总结

单例模式最重要的知识点在于其创建模式,要保证多线程安全的同时又能达到懒加载是最好的实现方式。
最易想到的应该是懒汉式(线程安全)的方法,但是对于静态代码块、静态内部类、枚举的骚操作也应该有所掌握。

本文地址:https://blog.csdn.net/weixin_44215363/article/details/109636770