Double Checked Locking 模式

之前在使用Double Check Locking 模式时,发现自己还是不太理解。于是写个记录,其实很简单,一看就明白了。

应用特别说明:
1.Double Check Locking模式是singleton的多线程版本,如果是单线程则应使用singleton。
2.Double Check Locking模式依就会使用锁——临界区锁定,不要以为可以避免使用锁。
3.Double Check Locking 解决的问题是:当多个线程存在访问临界区企图时,保证了临界区只需要访问一次。

下面是其适用特点:
1.多个线程试图并发访问一个临界区;
2.临界区只需执行一次;

分析如下3种方法:

//class singleton
//:s1-
singleton* get_instance(void)
{
    lock();
    if( instance == 0) {
       instance = new singleton;
    }
    unlock();
    return instance;
}
**存在的问题是:无论是否已经初始化都要加锁,增加了负荷,已经没有所谓的并发性能了。

//:s-2
singleton* get_instance(void)
{
    if( instance == 0){
        lock();
        instance = new singleton;
        unlock();
    }
    return instance;
}
**存在的问题是:不能保证临界区只初始化一次,没能实现singleton的基本功能;

//:s-3
singleton* get_instance(void)
{
    if( instance == 0){
        lock();
        if( instance == 0 )
            instance = new singleton;
        unlock();
    }
    return instance;
}
**解决上述问题——双检锁模式。

时间: 2024-11-08 22:29:33

Double Checked Locking 模式的相关文章

如何正确地写出单例模式

单例模式算是设计模式中最容易理解,也是最容易手写代码的模式了吧.但是其中的坑却不少,所以也常作为面试题来考.本文主要对几种单例写法的整理,并分析其优缺点.很多都是一些老生常谈的问题,但如果你不知道如何创建一个线程安全的单例,不知道什么是双检锁,那这篇文章可能会帮助到你. 懒汉式,线程不安全 当被问到要实现一个单例模式时,很多人的第一反应是写出如下的代码,包括教科书上也是这样教我们的. public class Singleton { private static Singleton instan

有关“双重检查锁定失效”的说明

原文地址 译者:丁一 双重检查锁定(以下称为DCL)已被广泛当做多线程环境下延迟初始化的一种高效手段. 遗憾的是,在Java中,如果没有额外的同步,它并不可靠.在其它语言中,如c++,实现DCL,需要依赖于处理器的内存模型.编译器实行的重排序以及编译器与同步库之间的交互.由于c++没有对这些做出明确规定,很难说DCL是否有效.可以在c++中使用显式的内存屏障来使DCL生效,但Java中并没有这些屏障. 来看下面的代码 01 // Single threaded version 02 class

Android 设计模式 之 单例模式

设计模式中,最简单不过的就是单例模式.先看看单例模式 原文:http://www.iteye.com/topic/575052 Singleton模式可以是很简单的,它的全部只需要一个类就可以完成(看看这章可怜的UML图).但是如果在"对象创建的次数以及何时被创建"这两点上较真起来,Singleton模式可以相当的复杂,比头五种模式加起来还复杂,譬如涉及到DCL双锁检测(double checked locking)的讨论.涉及到多个类加载器(ClassLoader)协同时.涉及到跨J

单例模式和双重检测的小结

设计模式的经典模式之一--单例模式 这个也是面试经常被问起的面试,一般都要求手写 [饿汉模式]非延时加载 --以空间换时间 [懒汉模式]延时加载--以时间换空间 看似简单,但是在懒汉模式还隐藏了一个双重检测,其中还是涉及到JVM内存的"无序写入"问题(后面使用的 volatile ) 1.饿汉模式 比较简单,非延时加载,一上来就把对象给new出来了 [java] view plain copy <span style="font-family:Microsoft YaH

Java内存模型FAQ(十一)新的内存模型是否修复了双重锁检查问题?

原文:http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html#dcl 译者:Alex 臭名昭著的双重锁检查(也叫多线程单例模式)是一个骗人的把戏,它用来支持lazy初始化,同时避免过度使用同步.在非常早的JVM中,同步非常慢,开发人员非常希望删掉它.双重锁检查代码如下: // double-checked-locking - don't do this! private static Something instance = n

HBase-1.2.4LruBlockCache实现分析(二)

        本文介绍LruBlockCache如何获取缓存数据.         缓存数据的获取是在方法getBlock()中实现的,代码如下: /** * Get the buffer of the block with the specified name. * @param cacheKey block's cache key * @param caching true if the caller caches blocks on cache misses * @param repea

从C++单例模式到线程安全详解_C 语言

先看一个最简单的教科书式单例模式: class CSingleton { public: static CSingleton* getInstance() { if (NULL == ps) {//tag1 ps = new CSingleton; } return ps; } private: CSingleton(){} CSingleton & operator=(const CSingleton &s); static CSingleton* ps; }; CSingleton*

Java线程面试题 Top 50

不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题.Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员 的欢迎.大多数待遇丰厚的Java开发职位都要求开发者精通多线程技术并且有丰富的Java程序开发.调试.优化经验,所以线程相关的问题在面试中经常会 被提到. 在典型的Java面试中, 面试官会从线程的基本概念问起, 如:为什么你需要使用线程, 如何创建线程,用什么方式创建线程比较好(比如:继承thread类还是调用Runnable接口),然后逐渐问到并发问题像

Java线程面试题 Top 50(转)

  不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题.Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员的欢迎.大多数待遇丰厚的Java开发职位都要求开发者精通多线程技术并且有丰富的Java程序开发.调试.优化经验,所以线程相关的问题在面试中经常会被提到. 在典型的Java面试中, 面试官会从线程的基本概念问起, 如:为什么你需要使用线程, 如何创建线程,用什么方式创建线程比较好(比如:继承thread类还是调用Runnable接口),然后逐渐问到并发问题像