`

Double Checked Locking双重检查锁

阅读更多

要使Double Checked Locking双重检查锁模式正常工作,JDK必须>=1.5, 并且使用volatile关键字。

http://jeremymanson.blogspot.com/2008/05/double-checked-locking.html

这篇文章介绍了为什么Double Checked Locking会不工作。

// Broken -- Do Not Use! 
class Foo {
  private Helper helper = null;
  public Helper getHelper() {
    if (helper == null) {
      synchronized(this) {
        if (helper == null) {
          helper = new Helper();
        }
      }
    }
  return helper;
}

 

从代码的语义看, 代码先创建了Helper的实例,然后赋值(write)给变量helper。然而代码在实际运行时,JIT编译器不会保证类的初始化会在变量赋值(write)之前完成。这时候,如果有其它线程在变量赋值和Helper实例创建完成之间读取helper,就会发生问题。

JDK1.5之后volatile增加了新功能,就是会严格控制volatile变量读写的顺序,JIT生成指令时不会打乱读写之前或者之后的顺序(之前的或者之后的可以被打乱),这样就能保证在写helper之前,Helper已经实例化完成。

 

分享到:
评论

相关推荐

    C++ and the Perils of Double Checked Locking.zip

    《C++ and the Perils of Double Checked Locking》是一篇探讨C++编程中双重检查锁定(Double-Checked Locking)模式潜在问题的文献。在多线程编程中,双重检查锁定是一种常见的优化策略,旨在减少对同步原语的依赖...

    双重检查锁

    双重检查锁(Double-Checked Locking, DCL)是一种在多线程环境中用于实现懒加载(lazy loading)的设计模式。它通过两次检查来确定是否需要获取锁,从而避免不必要的同步操作,提高程序性能。然而,DCL的实现并不像表面...

    Java-设计模式-单例模式-实现源码(简单实现、双重检查锁、静态内部类、枚举类)

    在Java中,有多种实现单例模式的方法,包括简单实现、双重检查锁定(Double-Checked Locking)、静态内部类和枚举类。下面我们将详细探讨这些不同的实现方式。 1. **简单实现(非线程安全)** 最简单的单例实现...

    Java双重检查加锁单例模式的详解

    DCL(Double-checked locking)是Java双重检查加锁单例模式的一种实现方法。它使用了synchronized关键字来确保线程安全,但是这也会带来性能损失。DCL看起来是一个聪明的优化,但是它却不能保证正常工作。 在多线程...

    Java多线程之延迟初始化1

    synchronized (DoubleCheckedLocking.class) { if (instance == null) { instance = new Instance(); } } } return instance; } } ``` 双重检查锁定的关键在于使用`volatile`关键字修饰`instance`变量。`...

    单例模式简介和java代码实现

    }}在双重检查锁(Double-Checked Locking)实现中,第一次检查是在不加锁的情况下进行的,只有当第一次检查后 instance 仍然为 null 时,才会进入同步代码块进行第二次检查和实例化。这种方式提高了并发性能,因为...

    Java并行(3):可见性重访之锁、Volatile与原子变量1

    尽管如此,`volatile`在某些场景下,如单例模式的双重检查锁定(Double-Checked Locking)或者作为标志位时,可以有效提升性能,同时保证基本的可见性。 总结来说,Java中的锁和`volatile`关键字都是为了应对并发...

    前端js基础学习实践,面试重点

    为了保证线程安全地创建单例对象,经常采用双重检查锁定(Double-Checked Locking)技术。此技术的核心在于: 1. **为什么要使用`volatile`关键字?** - **线程可见性**:在Java中,`volatile`关键字是一种实现跨线程...

    41丨单例模式(上):为什么说支持懒加载的双重检测不比饿汉式更优?1

    3. **双检锁/双重校验锁(Double-Checked Locking)**:结合了懒汉式的延迟加载和饿汉式的线程安全性。在多线程环境中,第一次检查实例是否已经创建,如果没有创建,则进行同步锁定,确保只有一个线程能够创建实例。...

    单例模式七种写法_转

    文章提到的双重检查锁定(Double-Checked Locking,简称DCL)是一个在单例模式中用来优化性能的编程技巧。该技巧的核心在于减少同步的开销,在多线程环境下,仅在实例未被创建时才同步。然而,这个技巧在Java早期...

    JAVA中单例模式的几种实现方式.doc

    双重检查锁定(Double Checked Locking, DCL) 双重检查锁定是一种优化过的线程安全单例模式实现,通过减少不必要的同步操作提高效率。其实现思路是在外部先检查一次实例是否为null,如果不为null则直接返回实例,...

    第三节 单例模式1

    为了解决带锁单例模式的性能问题,我们可以使用双重检查锁定(double-checked locking)。在Go中,虽然不需要双重检查,但可以优化为"一次检查锁定",即在检查`instance`是否为`nil`后才加锁,如果`instance`已经不...

    设计模式之单利设计模式

    ##### 双重检查锁定(Double-Checked Locking) 双重检查锁定是一种更高效的单例模式实现方法。这种方式首先检查实例是否已经创建,如果没有创建才进入同步块,这避免了每次调用`getInstance()`方法时都要进行同步...

    C++CLI中实现singleton模式

    双重检测锁(Double-Checked Locking)实现的Singleton模式在多线程应用中有相当的价值。在ACE的实现中就大量使用ACE_Singleton模板类将普通类转换成具有Singleton行为的类。这种方式很好地消除了一些重复代码臭味,...

    QT单例模式、多线程、双重校验加锁

    在QT中,单例模式、多线程以及双重校验加锁(Double-Checked Locking)是常见的编程模式和技术,尤其在处理并发和资源管理时显得尤为重要。 **单例模式** 是一种设计模式,确保一个类只有一个实例,并提供一个全局...

    毕向东静态07

    视频可能详细讲述了如何在Java中实现单例的第二种方式,这通常涉及到懒汉式(Lazy Initialization)的双重检查锁定(Double-Checked Locking)。 在Java中,单例模式的实现通常有两种主要方法: 1. 饿汉式(Eager ...

    单例模式,懒汉模式和饿汉模式

    在多线程环境下,线程安全的懒汉模式通常采用**双重检查锁定(Double-Checked Locking,DCL)**策略。这种策略是在获取单例实例时进行两次检查:第一次检查是在无须同步的情况下完成的,如果发现单例未被创建,则...

    Java多线程编程环境中单例模式的实现

    为了提高性能,人们提出了**双重检查锁定**(Double-checked locking)的方法。这种方法首先在不加锁的情况下检查`instance`是否为`null`,如果为`null`则进行同步操作: ```java public static Singleton ...

    java单例模式详解Java系列2021.pdf

    为了兼顾线程安全和效率,可以采用双重检查锁定(Double-Checked Locking)模式。这种写法只在实例未被创建时才加锁,从而减少锁的开销,提高了性能。具体实现是通过双重null检查,外层检查是否已经创建实例,内层...

Global site tag (gtag.js) - Google Analytics