创建型设计模式-单例设计模式和应用
单例设计模式:
- 这个是最简单的设计模式,所以拎出来第一个讲, 但事实却不是。
- 单例意思只包含一个对象被称为单例的特殊类
- 通过单例模式可以保证系统中,应用该模式的类只有一个对象实例
使用场景:
- 业务系统全局只需要一个对象实例,比如发号器、redis连接对象等
- Spring IOC容器中的bean默认就是单例
- spring boot 中的controller、service、dao层中通过@autowire的依赖注入对象默认都是单例的
分类:
- 懒汉:就是所谓的懒加载,延迟创建对象
- 饿汉:与懒汉相反,提前创建对象
实现步骤:
- 私有化构造函数
- 提供获取单例的方法
一、单例设计模式中的懒汉方式实战
单例设计模式中的懒汉方式实战+双重检查锁定
package net.xdclass.single;
/**
* 单列设计模式
* 懒汉模式
*/
public class SingletonLzay {
private static SingletonLzay instance;
public void process(){
System.out.println("单列设计模式-懒汉");
}
/**
* 构造函数私有化
*/
private SingletonLzay() {
}
public static SingletonLzay getInstance3(){
if (instance == null){
synchronized(SingletonLzay.class){
if (instance == null){
instance = new SingletonLzay();
}
}
}
return instance;
}
}
此方法是绝大多数人的用法,但是该方法依然存在问题
instance = new SingletonLzay();并不是原子性操作
* 1.分配空间给对象 * 2.在空间内创建对象 * 3.将对象赋值给引用instance
假如线程1>3>2顺序,会把值写入主内存,其他线程就会读取到instance最新值,但是这个是不完全的对象(指令重排)
改进方案
volatile java提供的关键字,可以禁止指令重排运行效果如下
二、单例设计模式中的饿汉方式实战
饿汉方式:提前创建好对象
优点:实现简单,没有多线程同步问题
缺点:不管有没使用,instance对象一直占着这段内存
如何选择:
- 如果对象不大,且创建不复杂,直接用饿汉的方式即可
- 其他情况则采用懒汉实现方式
/**
* 饿汉模式
*/
public class SingletonHungry {
private static SingletonHungry instance = new SingletonHungry();
private SingletonHungry(){
}
public static SingletonHungry getInsyance(){
return instance;
}
public void process(){
System.out.println("饿汉模式-方法调用成功");
}
}
运行结果如下

拓展 :JDK源码里面的单例设计模式
- JDK中Runtime类 饿汉方式

JDK中Desktop类 懒汉方式

版权声明:本文为qq_58345908原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。