单例模式

2021-09-24  本文已影响0人  攻城虱小马褂

单例模式是一种简单的的设计模式。虽然简单,但是应用却是十分的广泛。所有有必要针对单例模式的知识点进行梳理。

单例模式

确保类只有一个实例,并自动实例化向整个系统提供全局的访问点。从定义上可以推断出单例模式更倾向于节约资源,利于资源的重用从而节约时间。所以应用单例模式的对象应该具有以下特点:

应用场景

单例模式设计的几点考虑

name 延迟加载 线程安全 并发性能 序列化/反序列化安全
饿汉式 N Y Y N
懒汉式(不加锁) Y N Y N
懒汉式(加锁) Y Y N N
DCL Y Y Y N
静态内部类 Y Y Y N
枚举 N Y Y Y

单例模式实现

  1. 饿汉式

类加载时完成初始化

public class Singleton {
    private static Singleton singleton = new Singleton();

    private Singleton(){}

    public static Singleton getInstance(){
        return singleton;
    }
}
  1. 懒汉式

获取对象的时候完成初始化,实现懒加载。但是线程不安全,高并发下会出现多个实例。

public class Singleton {
    private static Singleton instance = null;

    private Singleton(){}

    public static Singleton getInstance(){
        if( instance == null){
            instance = new Singleton();
        }
        return instance;
    }
}
  1. 懒汉式(加锁)

线程安全的懒汉式单例模式。

public class SafeSingleton {

    private static SafeSingleton instance = null;

    private SafeSingleton(){}

    public static synchronized SafeSingleton getInstance(){
        if(instance == null){
            instance = new SafeSingleton();
        }

        return instance;
    }
}
  1. 双重检查DCL
public class Singleton {
    private volatile static Singleton instance;

    private Singleton(){}

    public static Singleton getInstance(){
        if(instance == null){
            synchronized (Singleton.class){
                if(instance == null){
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}
  1. 静态内部类
public class Singleton {

    private static class SingletonHolder{

        private static final Singleton instance = new Singleton();

    }

    private Singleton(){}

    public static final Singleton getInstance(){
        return SingletonHolder.instance;
    }
}
  1. 枚举
public enum Singleton {
    INSTANCE;

    public void getInstance(){

    }
}

如何设计优秀的单例模式

引申

  1. 双重校验DCL为什么使用volatile
  2. synchronized与volatile的区别
上一篇 下一篇

猜你喜欢

热点阅读