Java中什么是双检锁

12 篇文章 0 订阅

Java 中什么是双检锁

一、概述

1、简介

在Java中,双重检查锁定(Double-Checked Locking)是一种多线程编程中用来减少同步的开销的技术。双检锁的主要用途是**在创建单例模式时,确保只有一个实例被创建,尤其是在懒汉式单例模式中,**它被大量使用。

2、基本思想

基本思想:双检锁的基本思想是,在锁定代码之前先检查实例是否已经被创建,如果没有创建,才进行同步。这样,只有第一次访问会同步,之后的访问都不会执行锁定,大大减少了锁的开销。

二、代码演示

1、代码示例

public class Singleton {
    // volatile关键字确保instance变量的修改对所有线程立即可见,并禁止指令重排序优化
    private volatile static Singleton instance;

    private Singleton() {
        // 私有构造函数,防止外部实例化
    }

    public static Singleton getInstance() {
        if (instance == null) { // 第一次检查:如果实例不存在,进入同步代码块
            synchronized (Singleton.class) {
                if (instance == null) { // 第二次检查:同步后再次检查以确保实例未被创建
                    instance = new Singleton(); // 创建实例
                }
            }
        }
        return instance; // 返回已创建的实例
    }
}

2、说明

在这段代码中,instance 变量被声明为 volatile这是非常关键的。由于Java内存模型的原因,在没有volatile修饰的情况下,双检锁可能会失效,因为编译器和处理器可能会对指令进行重排序优化,导致在实例化对象时出现非预期的行为。例如,一个线程可能看到instance 不为 null,但是其构造还没有完成,从而导致访问该实例时发生错误。

使用 volatile 关键字可以防止这种重排序,确保在 instance 变量写入之前,对象的构造已经完成,从而保证了线程安全

但是需要注意的是,在 Java 5 及以上版本,双检锁才能正常工作,因为 Java 5 对内存模型进行了增强,确保了 volatile 关键字的语义正确执行。在早期版本的 Java 中使用双检锁仍然存在风险。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值