单例模式(线程安全)

单例模式

  1. 构造方法需要私有private,不要被外部访问(若外部能访问,就会被创建多个实例)
 private OnlineTest() {
    }
  1. 增加一个实例属性,设置为私有的private(不被外部访问,仅能通过调用方法获取实例)、静态的static(保证只有一份)、volatile(保证属性在加载/赋值的过程中,不会被JVM指令重排序)

private static volatile OnlineTest onlineTest;

//创建对象的步骤:1)JVM在栈内存中开辟一块空间、2)加载信息、3将地址赋值给onlineTest (JVM为了执行性能,可能会重排2和3的顺序),若先赋值再加载,可能会出现并发导致创建多个实例
//如:OnlineTest onlineTest = new OnlineTest();
  1. 提供一个获取实例的方法:
    静态的static(保证可以直接通过类名访问,无需创建实例)
    synchronized(加锁,解决并发问题。当onlineTest为空,才需要加锁;加锁后,还需判断onlineTest为空,再创建实例并赋值)
//volatile保证属性 加载/赋值的过程中,不会被JVM指令重排序(JVM虚拟机 对象的开票和赋值的过程中,可能会产生命令重排序)
    
    private static volatile OnlineTest onlineTest;
    private OnlineTest() {
    }

    //加锁synchronized解决现成安全问题
    public static OnlineTest getInstance() {
        if(onlineTest == null) {
            synchronized (OnlineTest.class){
                if(onlineTest == null) {
                    onlineTest = new OnlineTest();
                }
            }

        }
        return onlineTest;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值