设计模式 - 单例模式
文章目录
- [设计模式 - 单例模式](#设计模式 - 单例模式)
-
- [1 什么是单例模式?](#1 什么是单例模式?)
- [2 编写方式](#2 编写方式)
-
- [2.1 饿汉式](#2.1 饿汉式)
- [2.2 懒汉式](#2.2 懒汉式)
- [2.3 静态内部类写法](#2.3 静态内部类写法)
1 什么是单例模式?
单例(Singleton):保证只能创建一个该类的对象。
实现单例三个步骤
- 私有化构造方法
- 在类内部创建一个对象
- 在类中添加一个公开的方法,返回单例对象
2 编写方式
2.1 饿汉式
饿汉式: 类加载时, 对象则实例化
代码实现:
SingleTon:
java
public class SingleTon {
private SingleTon() {
}
private static final SingleTon INSTANCE = new SingleTon();
public static SingleTon getInstance(){
return INSTANCE;
}
}
Test:
java
public class Test {
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
new Thread(() -> {
SingleTon instance = SingleTon.getInstance();
System.out.println(instance);
}).start();
}
}
}
2.2 懒汉式
懒汉式: 使用时创建, 线程不安全
代码实现:
java
public class SingleTon2 {
private SingleTon2() {
}
//volatile: 保证可见性, 有序性(禁止指令重排)
private static volatile SingleTon2 instance = null;
public static SingleTon2 getInstance() {
//DCl(Double Check Lock) 双重检测锁
if (instance == null) {
synchronized (SingleTon2.class) {
if (instance == null) {
instance = new SingleTon2();
//1 在堆中开辟空间, 所有属性值为默认值
//2 执行构造方法
//3 把地址赋值给变量
//正常 没有发生指令重排 1 2 3
//发生指令重排 1 3 2
}
}
}
return instance;
}
}
2.3 静态内部类写法
静态内部类写法: 属于懒汉式写法, 没有线程安全问题
代码实现;
java
public class SingleTon3 {
private SingleTon3() {
}
static class Holder {
//静态属性, 类加载时执行. 只执行一次, 没有线程安全问题
static {
System.out.println("静态内部类加载了");
}
private static final SingleTon3 INSTANCE = new SingleTon3();
}
public static SingleTon3 getInstance() {
return Holder.INSTANCE;
}
}