Java23种设计模式之「单例模式」
2020-07-22 本文已影响0人
MrLimLee
单例模式 之 holder 模式 (推荐)
/**
* 单例模式 之 holder 模式
* 带有 Holder 的方法,
* 类级内部类,静态的成员内部类,该内部类的实例与外部类的实例没有绑定关系
* 只有在调用的时候才会被封装,从而实现了延迟加载,即懒汉式
*
* holder方式的单例模式是最好的设计之一,也是目前用的比价广泛的设计之一
*
* 优点:
* 将懒加载和线程安全完美结合的一种方式(无锁)
*
* 缺点:
*
* 注:
* final 修饰,不允许被继承
*
* @author Mr.Lim
*/
public final class SingletonModeOfHolder {
private static class SingletonModeOfHolderIn {
/**
* 静态初始化,由JVM来保证线程安全
*/
public static final SingletonModeOfHolder INSTANCE =
new SingletonModeOfHolder();
}
public static SingletonModeOfHolder getInstance() {
return SingletonModeOfHolderIn.INSTANCE;
}
public SingletonModeOfHolder() { }
}
单例模式 之 饱汉模式(懒汉模式)
/**
* 单例模式 之 饱汉模式(懒汉模式)
*
* 优点:
* 启动快,资源占用小,使用时才实例,无锁
*
* 缺点:
* 非线程安全的,多线程下不能保证单例的唯一性
*
* 注:
* final 修饰,不允许被继承
*
* @author Mr.Lim
*/
public final class SingletonModeOfFull {
private static SingletonModeOfFull instance = null;
public SingletonModeOfFull getInstance () {
if (instance == null) {
instance = new SingletonModeOfFull();
}
return instance;
}
public SingletonModeOfFull() {}
}
单例模式 之 双重锁检查 (Double Check Lock)
/**
* 单例模式 之 饱汉模式(懒汉模式) 线程安全 双重锁检查 (Double Check Lock)
*
* 优点:
* 懒加载,线程安全
*
* 缺点:
*
* 注:
* 实例必须有 volatile 关键字修饰,保证初始化完全,保证了变量的可见性(visibility)
* 被 volatile 关键字修饰的变量,如果值发生了变化,其他线程立马可见
*
* @author Mr.Lim
*/
public final class SingletonModeOfFullDCL {
private volatile static SingletonModeOfFullDCL instance = null;
public static SingletonModeOfFullDCL getInstance() {
// 判断实例是否存在,如果不存在进入下面的同步块
if (instance == null) {
// 同步 线程安全的创建实例
synchronized (SingletonModeOfFullDCL.class) {
// 再次检查实例是否存在
if (instance == null) {
instance = new SingletonModeOfFullDCL();
}
}
}
return instance;
}
public SingletonModeOfFullDCL() {}
}
单例模式 之 饱汉模式(懒汉模式) 线程安全
/**
* 单例模式 之 饱汉模式(懒汉模式) 线程安全
*
* 优点:
* 启动快,资源占用小,使用时才实例,有锁
*
* 缺点:
* synchronized 为独占排他锁,并发性差,即使在创建成功之后,获取实例仍然是串行化操作
*
* @author Mr.Lim
*/
public final class SingletonModeOfFullSafe {
private static SingletonModeOfFullSafe instance = null;
public static synchronized SingletonModeOfFullSafe getInstance() {
if (instance == null) {
instance = new SingletonModeOfFullSafe();
}
return instance;
}
public SingletonModeOfFullSafe() {}
}
单例模式 之 饿汉模式
/**
* 单例模式 之 饿汉模式
*
* 优点:
* 饿汉模式天生是线程安全的,使用时没有延迟
*
* 缺点:
* 时候即创建实例,启动慢,有可能造成资源浪费
*
* @author Mr.Lim
*/
public final class SingletonModeOfHungry {
/**
* 类加载即创建对象
*/
private final static SingletonModeOfHungry INSTANCE = new SingletonModeOfHungry();
/**
* 提供给外接获取对象的方法
*/
public static SingletonModeOfHungry getInstance() {
return INSTANCE;
}
/**
* 私有化构造器 防止外接创建对象
*/
private SingletonModeOfHungry() {
}
}