前言
单例模式是 Java中最基础也是最简单,最常用的设计模式之一。在运行期间,保证某个类只创建一个实例,保证一个类仅有一个实例,并提供一个访问它的全局访问点。而不管是懒汉式,饿汉式,还是通过加 volatile 双重锁校验,甚至是使用内部类来实现的单例模式,在反射 API 的魔爪下都不能保证严格的单例。
传统的单例写法解决了什么问题
首先,在除面试外的大多数情况下,传统的单例写法已经完全够用了。
通过 synchronized 关键字解决了多线程并发使用。
public synchronized static SingleClassV1 getInstance(){
if(instance == null){
instance = new SingleClassV1();
}
return instance;
}
考虑到每次获取单例对象都需要加锁,解锁。又有人发明了双重锁校验 + volatile 关键字模式:
private static volatile SingleClassV2 instance;
public static SingletonV2 getInstance() {
if(instance == null){
synchronized (SingletonV2.class){
if(instance == null){