前言
懒汉饿汉
1、饿汉模式
public final class Singleton {
// 创建好实例
private static Singleton instance = new Singleton();
// 构造函数
private Singleton() {}
// 获取实例
public static Singleton getInstance() {
return instance;
}
}
2、懒汉模式
public final class Singleton {
private static Singleton instance = null;
// 构造函数
private Singleton() {}
// 获取实例
public static Singleton getInstance() {
// 为null时才实例化对象
if (null == instance) {
instance = new Singleton();
}
return instance;
}
}
同步锁
public final class Singleton {
private static Singleton instance = null;
// 构造函数
private Singleton() {}
// 获取实例
public static Singleton getInstance() {
// 获取对象时加上同步锁
if (null == instance) {
synchronized (Singleton.class) {
instance = new Singleton();
}
}
return instance;
}
}
双重检查锁
public final class Singleton {
private static Singleton instance = null;
// 构造函数
private Singleton() {}
// 获取实例
public static Singleton getInstance() {
// 第一次判断,当instance为null时则实例化对象
if(null == instance) {
synchronized (Singleton.class) {
// 第二次判断,放在同步锁中,当instance为null时则实例化对象
if(null == instance) {
instance = new Singleton();
}
}
}
return instance;
}
}
最优双重检查锁
public final class Singleton {
// 加上volatile关键字
private volatile static Singleton instance = null;
// 构造函数
private Singleton() {}
// 获取实例
public static Singleton getInstance() {
// 第一次判断,当instance为null时则实例化对象
if(null == instance) {
synchronized (Singleton.class) {
// 第二次判断,放在同步锁中,当instance为null时则实例化对象
if(null == instance) {
instance = new Singleton();
}
}
}
return instance;
}
}
枚举模式
public class Singleton {
// 构造函数
private Singleton() {
}
// 从枚举中获取实例
public static Singleton getInstance() {
return SingletonEnum.SINGLETON.getInstance();
}
// 定义枚举
private enum SingletonEnum {
SINGLETON;
private Singleton instance;
// JVM保证这个方法只调用一次
SingletonEnum() {
instance = new Singleton();
}
public Singleton getInstance() {
return instance;
}
}
}
总结
心得
本人原创文章纯手打,觉得有一滴滴帮助的话就请点个推荐吧~
本人长期分享工作中的感悟、经验及实用案例,喜欢的话也可以关注一下哦~