手写单例设计模式

参考:《Head Fisrt 设计模式》

1、立即加载

立即加载就是使用类的时候已经将对象创建完毕

优点:简单,没有多线程同步问题

缺点:实例没有用到的时候,对象会一直占着这个空间

public class Singleton {
    // 将自身实例化对象设置为一个属性,并用static、final修饰
    private static final Singleton instance = new Singleton();
    private Singleton() {}
    public static Singleton getInstance() {
        return instance;
    }
}

2、如果 getInstance() 的性能对应用程式不是很关键

给 getInstance() 加 synchronized 关键字,懒加载

public class Singleton{
    private static Singleton uniqueInstance;
    private Singleton(){
    //每个线程在进入这个方法之前都需要等待上一个线程离开这个方法
    public static synchronized Singletion getInstance(){
        if(uniqueInstance == null){
            uniqueInstance = new Singleton();
        }
        return uniqueInstance;
    }
}

3、非延迟加载的做法。

JVM在保证任何线程访问uniqueInstance变量之前,一定先创建此实例

public class Singleton{
    private static Singleton uniqueInstance
                = new Singleton();
    private Singleton(){}
    public static Singletion getInstance(){
        return uniqueInstance;
    }
}

4、双重检查加锁,在 getInstance() 中减少使用同步

volatile + synchronized + 延迟加载 , 性能最好:大大减少 getInstance() 的时间。

public class Singleton{
    private volatile static Singleton uniqueInstance;
    private Singleton(){
    //检查实例,如果不存在,就进入同步区块
    //注意只有第一次才彻底执行这里的代码
    public static Singletion getInstance(){
        if(uniqueInstance == null){
            Synchronized(Singleton.class){
                //进入同步区块之后,再检查一次。如果仍然是null,才创建实例
                if(uniqueInstance == null){
                    uniqueInstance = new Singleton();
                }
            }
        }
        return uniqueInstance;
    }
}

单例模式的特点

  • 1,确保一个类只有一个实例,并提供全局访问点
  • 2,构造器是私有的

你可能感兴趣的:(单例,设计模式,手写,手撕代码)