手写设计模式

单例模式

饿汉式

java 复制代码
public class SingleTon {

    private static SingleTon instance = new SingleTon();

    private SingleTon(){};

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

要点:

  1. 静态 private instance
  2. 私有的构造器
  3. 方法返回 instance

懒汉式

java 复制代码
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. volatile 修饰 instance
  2. 双端锁检验
  3. 构造器私有化

为什么需要 volatile:

主要由于双端锁检验和指令重排共同造成的问题:

  1. 双端锁减少了在锁外等待的线程,提高了效率但是也造成了问题。
  2. new 对象的过程
    1. 分配空间
    2. 初始化对象
    3. 引用指向对象
  3. 其中第 2,3 步可能会重排,造成 instance 判断不为空,但是并未初始化,结果该线程不再等待锁直接返回了 instance,此时 instance 未被初始化,线程不安全。
  4. volatile 禁止指令重排,先初始化再引用指向。
相关推荐
困鲲鲲6 小时前
设计模式:中介者模式 Mediator
设计模式·中介者模式
困鲲鲲9 小时前
设计模式:状态模式 State
设计模式·状态模式
蝸牛ちゃん12 小时前
设计模式(十一)结构型:外观模式详解
设计模式·系统架构·软考高级·外观模式
weixin_4708802613 小时前
设计模式实战:自定义SpringIOC(亲手实践)
设计模式·面试·个人提升·springioc·设计模式实战·spring框架原理
阳光明媚sunny14 小时前
创建型设计模式-工厂方法模式和抽象工厂方法模式
设计模式·工厂方法模式
困鲲鲲15 小时前
设计模式:代理模式 Proxy
设计模式·代理模式
就是帅我不改18 小时前
深入实战工厂模式与观察者模式:工厂模式与观察者模式在电商系统中的应用
后端·设计模式
云中飞鸿1 天前
结合项目阐述 设计模式:单例、工厂、观察者、代理
设计模式
蝸牛ちゃん1 天前
设计模式(二十四)行为型:访问者模式详解
设计模式·系统架构·软考高级·访问者模式
zy小狮子1 天前
【设计模式系列】策略模式vs模板模式
设计模式·策略模式