JUC-volatile的使用(单例)

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、作用:作为一个布尔状态标志,用于指示一次事件,例如完成初始化或者任务结束

      原因:状态标志不依赖于程序内其他任何状态,且通常只有一种状态转换

      例子:判断业务是否结束  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值