单例模式
- 定义:一个类只有一个实例化对象,类自行实例化,且对外界提供。
- 特点:类构造器私有
包括两种类型:懒汉式和饿汉式
1. 饿汉模式
随着类加载,直接加载对象,等待程序使用
public class Singleton {
private static Singleton singleton;
private Singleton(){}
public static Singleton getInstance() {
if (singleton == null) {
singleton = new Singleton();
}
return singleton;
}
}
2.懒汉式
类创建完毕后,有需要再加载,但存在并发问题。一般用双重测试锁或者添加关键字synchronized和volatile修饰类来解决。
- volatile:禁止指令重排序
- synchronized:一个变量在同一个时刻只允许一条线程对其进行 lock 操作
//懒汉式模式
public class Singleton {
private Singleton() {}
private static Singleton single=null;
//静态工厂方法
public static Singleton getInstance() {
if (single == null) {
single = new Singleton();
}
return single;
}
}
/*由于创建实例的过程single = new Singleton()不具有原子性,分为三步
1.分配内存 2.初始化对象 3.指向放分配的地址
而顺序可能是1->2->3,也可能是1->3->2,若还未初始化便已分配地址,则single不为空,但返回的的single还没初始化,没有内容*/
//双重测试锁
public static Singleton getInstance() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}