【高并发趣事三】——双重检查锁定与延迟初始化

本文探讨了在Java多线程编程中,如何使用双重检查锁定(DCL)进行延迟初始化以提高性能。文章揭示了DCL在多线程环境下可能出现的问题,原因在于指令重排导致的对象未初始化就被访问。作者提供了两种解决方案:基于volatile关键字的修正和利用类初始化的同步特性。这两种方法分别防止了指令重排和确保了线程安全的初始化。
摘要由CSDN通过智能技术生成

一、引言

在JAVA多线程程序中,有时候需要采用延迟初始化来降低初始化类和创建对象的 开销。双重检查锁定就是延迟 初始化技术。

二、双重检查锁定的由来

在jav进程中,有时候可能 需要推迟一些高开销对象的初始化操作,并且只有在使用这些对象时才进行初始化,此时,程序员可能会采用延迟初始化。还有一个经典的使用场景就是单利模式下的,为了提高性能 ,采用双重检查锁定模式。但是在使用的过程中我们需要一些技巧,否则很容易出现问题。

上面代码在多线程环境下,我们很容易出现问题,所以改进代码。

由于对getInstance()方法做了同步处理,synchronized将导致性能的开销。如果 getInstance()方法被多个线程频繁调用,将会导致程序执行性能下降。因此,为了提高性能,聪明的程序员想出了一个很好技巧: 双重检查锁定(DCL).继续优化代码

这段代码看起来非常完美,但是这是一个错误的优化,在线程执行到第4行代码的时候,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

g-Jack

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值