单例模式的各种写法
程序员文章站
2022-07-13 23:39:56
...
1.饿汉式单例模式
/**
* ClassName:HungerySingleton
* Description:饿汉式单例模式
* Author:YMJ
* Date:2020-07-10 21:55
* Version:V1.0
*/
public class HungerySingleton {
private static HungerySingleton hungerySingleton = new HungerySingleton();
//私有构造函数防止外部实例化
private HungerySingleton(){}
public static HungerySingleton getInstance(){
return hungerySingleton;
}
//特点:天生线程安全,类初始化时就创建对象,浪费内存,当由于浪费的内存资源小到可忽略不计,因此大多数场景下实用且方便
}
2.懒汉式单例模式
/**
* ClassName:LazySingleton
* Description:懒汉式单例模式
* Author:YMJ
* Date:2020-07-10 22:21
* Version:V1.0
*/
public class LazySingleton {
private static LazySingleton lazySingleton;
//私有构造函数防止外部实例化
private LazySingleton(){}
//synchronized是为了保证多线程下同一时间下始终只有一个线程进入运行
public synchronized static LazySingleton getInstance(){
if(null == lazySingleton){
lazySingleton = new LazySingleton();
}
return lazySingleton;
}
/**特点:类初始化时不会实例化对象,只有在第一次用到时会实例化
* 性能较差:原因是除了第一次用到会实例化,而之后的都是获取,但由于synchronized的存在,后续的多线程获取也只能单线程获取
*/
}
3.双重校验锁式单例模式(synchronized锁和volatile锁)
/**
* ClassName:DoubleCheckLockSingleton
* Description:双重校验锁单例模式
* Author:YMJ
* Date:2020-07-10 22:51
* Version:V1.0
*/
public class DoubleCheckLockSingleton {
/**
* volatile是一种轻量级的同步机制,它主要有两个特性:
* 一.是保证共享变量对所有线程的可见性
* 二.禁止指令重排序优化
* 这里核心是第二点
*/
private static volatile DoubleCheckLockSingleton doubleCheckLockSingleton;
//私有构造函数防止外部实例化
private DoubleCheckLockSingleton(){}
public DoubleCheckLockSingleton getInstance(){
if(null == doubleCheckLockSingleton){
synchronized (DoubleCheckLockSingleton.class){//或者synchronized (doubleCheckLockSingleton)
if(null == doubleCheckLockSingleton){
doubleCheckLockSingleton = new DoubleCheckLockSingleton();
}
}
}
return doubleCheckLockSingleton;
}
/**特点:
*性能高:多线程下,第一次创建实例后,后续线程都不用走同步代码块,而是直接返回之前创建的实例
*缺点:写法复杂
*/
}
4.枚举单例模式
/**
* ClassName:EnumSingleton
* Description:枚举单例模式
* Author:YMJ
* Date:2020-07-10 23:24
* Version:V1.0
*/
public class EnumSingleton {
//私有构造函数防止外部实例化
private EnumSingleton(){}
static enum enumClass{
//创建一个枚举对象(天生为单例)
INSTANCE;
private EnumSingleton enumSingleton;
//私有枚举构造函数防止外部实例化
private enumClass(){
enumSingleton = new EnumSingleton();
}
public EnumSingleton getInstance(){
return enumSingleton;
}
}
public EnumSingleton getInstance(){
return enumClass.INSTANCE.getInstance();
}
//特点:防止反射攻击和反序列化攻击 缺点:写法略微复杂
}