定义
确保一个类只能有一个实例,而且自行实例化,并向整个系统提供这个实例。(三个特征)
方式:
- 饿汉式
- 懒汉式 (双重检测机制,必须要volatile 防止指令重排)
类图
代码
public class SingletonPattern {
public static void main(String[] args) {
Singleton singleton = Singleton.getInstance();
System.out.println(singleton.toString());
}
}
class Singleton{
//饿汉式
// private static com.mxy.dp.Singleton singleton =new com.mxy.dp.Singleton();
//懒汉式
private volatile static Singleton singleton;
private Singleton(){}
public static Singleton getInstance(){
if(singleton==null){
synchronized (Singleton.class){
if(singleton==null){
singleton = new Singleton();
}
}
}
return singleton;
}
}
场景
知识点
1、类的静态变量是它本身的对象。
2、Synchronized 双重检查机制
(1) 假设有两个线程A和B,都进行完第一次判空了(不存在这样的对象), 进入Synchronized
(2) 这个时候A线程获取了类锁,然后B线程被阻塞,A线程新建了一个实例后释放了锁,B线程获取锁,又新建了一个实例,这破坏了单例设计模式的初衷。(保证单例)
3、Volatile 防止指令重排, 必须先从主存刷新最新的值,每次写入后必须立即同步回主存当中
4、单例模式是否全局唯一
单例模式是全局唯一,但是(1)在分布式系统中,会有多个JVM虚拟机,各个虚拟机都一个实例。(2)一个JVM虚拟机,但是多个类加载器加载这个类,也会产生多个实例。
5、单例模式一般作用
单例模式无状态(没有成员变量,一般以工具类的形式提供。