目录
1. 定义
单例模式,也叫单子模式,是一种常用的软件设计模式,属于创建型模式的一种。 在应用这个模式时,单例对象的类必须保证只有一个实例存在。 许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。
1.1 懒汉模式
延迟加载,只有在真正使用的时候,才开始实例化。
1.线程安全问题
2.double check 加锁优化
3.编译器(JIT),CPU 有可能对指令进行重排序,导致使用到尚未初始化的实例,可以通过添加volatile 关键字进行修饰对于volatile 修饰的字段,可以防止指令重排.
1.2 饿汉模式:
类加载的 初始化阶段就完成了 实例的初始化 。本质上就是借助于jvm类加载机制,保证实例的唯一性.类加载过程:
1,加载二进制数据到内存中,生成对应的Class数据结构
2.连接: a.验证,b.准备 (给类的静态成员变量赋默认值),c.解析
3.初始化: 给类的静态变量赋初值3
只有在真正使用对应的类时,才会触发初始化 如(当前类是启动类即main函数所在类,直接进行new 操作,访问静态属性、访问静态方法,用反射访问类,初始化一个类的子类等。
1.3 静态内部类
1.本质上是利用类的加载机制来保证线程安全
2.只有在实际使用的时候,才会触发类的初始化,所以也是懒加载的一种形式
2.应用场景
单例模式只允许创建一个对象,因此节省内存,加快对象访问速度,因此对象需要被公用的场合适合使用,如多个模块使用同一个数据源连接对。
3.实例如下
package com.onlyqi.test07;
public class Test11 {
public static void main(String[] args) {
new Thread(()->{
Singleton singleton = Singleton.getInstance();
System.out.println(singleton);
});
}
}
// 懒汉模式
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;
}
}
// 饿汉模式----借助类加载保证单例
class Hungrysingleton {
private static Hungrysingleton instance = new Hungrysingleton();
private Hungrysingleton() {
}
public static Hungrysingleton getInstance () {
return instance;
}
}