Skip to content

单例模式

全局只需要创建一个,也只能有一个,比如太阳/月亮等

类型

类型思想代码图片
懒汉模式能不创建就不创建,但是可能会有线程安全的问题
单例模式-懒汉模式
单例模式-懒汉模式
饿汉模式尽快创建,在项目启动/应用调用的时候就创建
单例模式-饿汉模式
单例模式-饿汉模式

代码链接

应用

  • 线程池/连接池等池化技术

线程安全问题

线程安全问题只会在懒汉模式下有,饿汉模式的没有线程安全问题的

针对下述代码,指出并修改相关的线程安全问题

  1. 序号 3 会出现线程安全问题,如果 t1 线程执行了 if 语句后, t2 线程也执行 if 那么就会出现线程安全问题
    单例模式-线程安全问题-1
    单例模式-线程安全问题-1

    解决方法是只需要加锁即可

  2. 序号 4 会出现指令重排序问题,它会把没有初始化的值赋值给其他线程, 如果此时调用了这个实例对象并使用了方法,就会出现问题

    正常情况下,赋值的指令顺序为

    1. 开辟空间
    2. 初始化开辟的空间
    3. 引用赋值

    但是在指令重排序后,就会变为 1-3-2 先赋值再开辟空间

    单例模式-线程安全问题-指令重排序
    单例模式-线程安全问题-指令重排序

    解决方法是只需要添加 volatile 即可


最终代码(请思考最终代码中的问题

问题答案:

第一个 if 是用来避免锁调用造成的阻塞问题

第二个 if保障代码是线程安全