【Java学习】双重检查锁定(DCL)与延迟初始化

本文介绍了Java中线程安全的延迟初始化问题,特别是双重检查锁定(DCL)的原理及其存在的问题。通过分析DCL的问题根源,提出基于volatile的解决方案和基于类初始化的解决方案,确保在多线程环境下正确实现延迟初始化,以避免性能开销。
摘要由CSDN通过智能技术生成

引出问题

在某些场景下,可能需要推迟一些高开销的对象初始化操作,即只有在使用该对象时才进行对象初始化操作,类似Spring中的lazy-init(懒加载)。

但是正确实现线程安全的延迟初始化需要一些技巧,否则在一些特殊情况(比如多线程)下很容易出现运行问题。比如,以下初始化代码在多线程下就是非安全的

public class UnsafeLazyinitialization {
   
    private static Instance instance;
    public static Instance getInstance() {
   
        if (instance == null) //A: 线程1执行
            instance = new Instance(); //B: 线程2执行
        return instance;
    }
}

在上面的UnsafeLazyinitialization中,当线程1执行到A处时,线程2正好执行到B处,此时线程A看到的是instance还没有被初始化。

对于UnsafeLazyInitialization,我们可以对getInstance()做同步处理来实现线程安全的延迟初始化。示例代码如下:

public class SafeLazyInitialization {
   
    private static Instance instance
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值