1、单例模式
public class SingletonDemo {
// 通过volatile声明,实现线程安全的延迟初始化
private volatile static SingletonDemo singleton;
// 私有化构造方法
private SingletonDemo() {
}
// 双重锁设计
public static SingletonDemo getInstance() {
if (singleton == null) {
// 多线程并发创建对象时,通过加锁保证只有一个线程能创建对象
synchronized (SingletonDemo.class) {
if (singleton == null) {
// 利用volatile禁止‘初始化对象’和‘设置singleton指向内存空间’的重排序
singleton = new SingletonDemo();
}
}
}
return singleton;
}
}
单例:现在比较好的做法是采用静态内部内的方式实现
public class SingletonDemo {
private SingletonDemo() {}
private static class SingletonDemoHandler{
private static SingletonDemo instance = new SingletonDemo();
}
public static SingletonDemo getInstance() {
return SingletonDemoHandler.instance;
}
}
通过枚举创建线程安全的,能抵御反射和序列化的单例
/**
* @author 江黎
* @date 2022-01-30
*/
public class EnumStarvingSingleton {
private EnumStarvingSingleton() {
}
public static EnumStarvingSingleton getInstance() {
return ContainerHolder.HOLDER.instance;
}
private enum ContainerHolder {
HOLDER;
private EnumStarvingSingleton instance;
ContainerHolder() {
instance = new EnumStarvingSingleton();
}
}
}
2、作用:作为一个布尔状态标志,用于指示一次事件,例如完成初始化或者任务结束
原因:状态标志不依赖于程序内其他任何状态,且通常只有一种状态转换
例子:判断业务是否结束