饿汉式
package singleton;
/**
* 饿汉式 线程安全
* 利用类加载机制,无需多余处理
*
* @Auther: 苏察哈尔丶灿
* @Date: 2020/8/6 17:03
* @Slogan: 我自横刀向天笑,笑完我就去睡觉。
*/
public class HungrySingleton {
private static HungrySingleton instance = new HungrySingleton();
private HungrySingleton() {
}
public static HungrySingleton getInstance() {
return instance;
}
}
懒汉式
声明:对象的创建过程如下
代码如下:
package singleton;
/**
* 懒汉式 线程安全
* DCL双重校验 + volatile内存屏障
*
* @Auther: 苏察哈尔丶灿
* @Date: 2020/8/6 16:55
* @Slogan: 我自横刀向天笑,笑完我就去睡觉。
*/
public class LazySingleton {
private volatile static LazySingleton instance = null;
private LazySingleton() {
}
public static LazySingleton getInstance() {
if (instance == null) {
synchronized (LazySingleton.class) {
if (instance == null) {
instance = new LazySingleton();
/*
* 字节码层,对象创建过程
*
* 1.分配空间
* 2.初始化类
* 3.引用赋值
*
* 2,3步骤可能指令重排,导致多线程出问题
* 为了防止指令重排,需要给instance设置volatile属性加内存屏障
*/
}
}
}
return instance;
}
}
静态内部类
package singleton;
/**
* 内部类单例 线程安全
* 利用类加载机制,无需多余处理
* 属于懒加载
*
* @Auther: 苏察哈尔丶灿
* @Date: 2020/8/6 17:08
* @Slogan: 我自横刀向天笑,笑完我就去睡觉。
*/
public class InnerClassSingleton {
private InnerClassSingleton(){
}
private static class SingletonHolder {
private static InnerClassSingleton instance = new InnerClassSingleton();
}
public static InnerClassSingleton getInstance() {
return SingletonHolder.instance;
}
}
反射可能会打破私有化的封装,产生非唯一性的实例对象,还需另行处理。