`

double-check

 
阅读更多

在Effective Java一书中提到double-check模式,并指出该模式在java中通常并不适用。该模式的结构如下

public Resource getResource(){
 if(resource==null){
   synchronized(this){
      if(resource==null){
          resource = new Resource();
       }
    }
  }
  return resource;
}

 该模式是对下面代码的改进

public synchonized Resource getResource(){
      if(resource == null){
             resource = new Resource();
      }
      return resource;
}

 为什么要有这个改进呢?首先第二段代码是对resource延迟初始化,等到第一次调用getResource()方法时才初始化。但是以后每次调用此方法都需要同步,而其实这个对象只会初始化一次。于是有了上面的改进

 

在java中double-check模式无效的原因是不同步情况下引用类型不是线程安全的。不过对于除了long和double的基本类型,double-check模式是使用的。

 

 

但是java的内存模式是不断改进的。Doug Lea在它的文章中写道“根据最新的JSR133的java内存模型,如果将引用类型声明为volatile,double-check模式就可以工作了”

如下

private volatile Resource resource;  
public Resource getResource(){  
  if (resource == null){   
    synchronized(this){   
      if (resource==null){  
        resource = new Resource();    
      }     
    }    
  }  
  return resource;  
}  

 

想起写过的一段代码异曲同工,有一个synchronized void start()方法,内部逻辑只走一次。有一个isStarted变量用于判断start()逻辑是否走过,代码如下

if(!isStarted){
  synchronized void  start(){
     if(!isStarted){
          逻辑实现
          isStarted = true;
      }
    }
};

 

 

转自:http://blog.csdn.net/dl88250/article/details/5439024

分享到:
评论

相关推荐

    某些并发环境下Double-check模型的改进

    在并发编程领域,Double-check锁定模式是一种常见的设计模式,用于实现单例模式。这个模式的主要目的是确保在多线程环境中,单例对象的创建是线程安全的,并且只被初始化一次。然而,原始的Double-check模式在某些...

    Java中的双重检查(Double-Check)详解

    Java中的双重检查(Double-Check)是一种用于实现线程安全单例模式的设计策略,它的核心思想是在确保对象只被初始化一次的同时,尽可能地减少同步的使用以提高性能。然而,在早期的Java版本中,双重检查模式存在一些...

    从单例谈double-check必要性,多种单例各取所需.doc

    为解决此问题,通常会使用双重检查锁定(Double-Check Locking),在上述代码中添加了同步机制,保证了线程安全。 4. **双检锁/双重检查锁定(DCL)**: - 在懒汉式的基础上,通过两次检查`person`是否为null来...

    double-check:@reiddraper的test.check(简单检查),已将ClojureClojureScript-portable弃用

    test.check(和double-check )的核心思想是,您无需为单元测试枚举预期的输入和输出,而是编写关于函数的属性,这些属性对于所有输入都应为true。 这使您可以编写简洁而强大的测试。 为什么要用叉子? 虽然test....

    VS2010 C++创建多视区窗口

    BOOL CMainFrame::OnCreateClient( LPCREATESTRUCT /*lpcs*/, CCreateContext* pcc) ... // Double-check for ON_NOTIFY in message map above ASSERT(AFX_IDW_PANE_FIRST == sw.IdFromRowCol(0,0)); return TRUE; }

    DCL常用设计方法

    在这个主题下,“DCL常用设计方法”通常指的是如何在Java等编程语言中实现Double-Check Locking(双重检查锁定)和其他相关的设计模式来优化并发性能。以下将详细介绍DCL及其相关的知识点。 1. 双重检查锁定...

    java代码-double check单例模式

    **Java代码 - 双重检查锁定(Double-Check Locking)单例模式** 在Java编程中,单例模式是一种常用的设计模式,它确保一个类只有一个实例,并提供一个全局访问点。这种模式在需要频繁创建和销毁对象的场景下非常...

    31468693915Voucher-Check-in.pdf

    - **预订房间类型:** Standard Double Room - **房间价格:** 欧元855.00(约合人民币6,690.51元) - **价格包含:** - VAT(增值税):欧元55.93 - 预授权金额:欧元855.00(约合人民币6,690.51元) 预授权是指...

    WordPress数据库清理插件Clean Options

    选择适当的选项,点击“Find Orphaned Options” --->进入“To double-check options in the Orphaned Options list”页面--->单击下方的“Select All“ ,选择页面中的内容---->点击”View Selected Options ...

    计算机后端-Java-Java高并发从入门到面试教程-发课程资料.zip

    - **Double-Check Locking**:理解双重检查锁定模式,以及其在单例模式中的应用。 - ** volatile与synchronized的区别**:深入探讨两者的异同。 通过本课程的学习,开发者不仅能掌握Java并发编程的基础知识,还能...

    C++设计模式-单实例

    - 为了提高效率,有些懒汉式实现会采用双检锁/双重校验锁(Double-Check Locking),这是一种优化过的懒汉式,既保证了线程安全,又避免了无谓的同步开销。 单例模式的应用场景广泛,包括但不限于: - 工具类:如...

    Android_memory-leak-debugging.pdf.zip_Android memory le_android_

    - 单例模式优化:使用Double-Check Locking或Application Context避免泄漏。 - 注册与注销:注册监听器或服务时,记得在不再需要时及时注销。 5. **最佳实践** - 避免在非静态内部类中引用外部对象,除非明确...

    【Java面试资料】-(机构内训资料)上海-拼多多-Java高级

    - 双重检查锁定(Double-Check Locking)与初始化-on-demand holder类设计模式。 5. **IO流与NIO** - 流的分类:字节流与字符流,输入流与输出流,缓冲流与转换流。 - 文件操作:File类的常用方法,文件复制与...

    only-run-one-application.rar_Only

    6. **.NET Framework的Singleton模式**:在C#等.NET语言中,可以通过静态成员和私有构造函数来实现单例,例如`Lazy<T>`类或双重检查锁定(Double-Check Locking)模式。 实现这样的功能可以避免用户意外打开多个...

    23种设计模式知识要点--更多Java进阶 www.cx1314.cn1

    线程安全的单例模式通常会使用双重检查锁定(Double-Check Locking)来避免同步开销。在非线程安全的实例中,如果没有正确处理并发,可能会导致多个实例的创建。解决这个问题的方法是在getInstance()方法前添加...

    Laravel开发-lock-laravel

    6. **设计模式应用**:在分布式环境中,可以利用如Double-Check Locking、Read-Write Locks等设计模式,结合Laravel提供的工具,来提高代码的并发性能和稳定性。 7. **代码示例**:在lock-laravel-master项目中,...

    SingleApplication-master源码

    在Java中,通常通过静态内部类或者双重检查锁定(Double-Check Locking)的方式来实现线程安全的单例。"SingleApplication"类可能就采用了这种方式,确保在多线程环境下也能正确并唯一地创建实例。这通常涉及到`...

    java之设计模式--各种设计模式解析

    实现单例通常采用双重检查锁定(Double-Check Locking)或静态内部类等方式,确保线程安全且只创建一次实例。 接下来是命令模式。命令模式将请求封装为一个对象,使得可以使用不同的请求、队列请求、或者支持撤销...

    中北大学体系结构试题及答案

    第一种实现方式是双重检查锁定(Double-Check Locking),在多线程环境下保证了线程安全,同时避免了不必要的同步开销。第二种是静态内部类的方式,利用Java类加载机制保证了线程安全,同时也更简洁。 三、抽象与...

Global site tag (gtag.js) - Google Analytics