如何使用double-check实现一个单例模式

private object m_mutex = new object();
private bool m_initialized = false;
private BigInstance m_instance = null;

public BigInstance Instance
{
    get
    {
        if (!this.m_initialized)
        {
            lock (this.m_mutex)
            {
                if (!this.m_initialized)
                {
                    this.m_instance = new BigInstance();
                    this.m_initialized = true;
                }
            }
        }

        return this.m_instance;
    }
}
时间: 2024-11-15 08:52:22

如何使用double-check实现一个单例模式的相关文章

Double Check形式的单例模式

这两天在看开源项目时,发现Event Bus和Universalimageloader中写单例模式都是Double Check的形式.平时总是看到各种各样的单例模式,如,饿汉式,懒汉式等等.其中大多存在问题.今天记录一种比较优秀的单例模式的写法------Double Check.以后我准备就用这种方法了.(虽然还有其他优秀的方式,比如内部静态类,枚举) 先上代码: public class ImageLoader { private volatile static ImageLoader in

练习创建一个单例模式例子

昨天有写过一个单例模式的练习.<单例模式(C#)> 写得较为复杂,今天再使用另外的方法来实现: class Au { private static readonly Au instance = new Au(); public static Au Instance { get { return instance; } } public void Start() { Console.WriteLine("Start..."); } public void Stop() { C

题二:写一个单例模式

/** * 2.写一个单例模式 */ public class Test2 { public static void main(String[] args) { System.out.println(Singleton.getSingleton().hashCode()); } } class Singleton{ private static Singleton singleton = new Singleton(); private Singleton(){} public static S

单例模式的两种实现方式对比:DCL (double check idiom)双重检查 和 lazy initialization holder class(静态内部类)

首先这两种方式都是延迟初始化机制,就是当要用到的时候再去初始化. 但是Effective Java书中说过:除非绝对必要,否则就不要这么做. 1. DCL (double checked locking)双重检查: 如果出于性能的考虑而需要对实例域(注意这个属性并没有被static修饰)使用延迟初始化,就使用双重检查模式 public class Singleton { private volatile Singleton uniqueInstance; private Singleton(){

PHP封装的一个单例模式Mysql操作类

掌握满足单例模式的必要条件----三私一公. ①私有的构造方法-为了防止在类外使用new关键字实例化对象. ②私有的成员属性-为了防止在类外引入这个存放对象的属性. ③私有的克隆方法-为了防止在类外通过clone成生另一个对象. ④公有的静态方法-为了让用户进行实例化对象的操作. DB类及相关表操作: class mysql_db{     //1.私有的静态属性   private static $dbcon = false;     //2.私有的构造方法   private functio

实现一个单例模式Singleton

分析: 1.单例模式表明该类只有一个实例被创建,首先将类的构造方法设置为私有,然后写一个public静态函数用来创建实例,利用该类的一个静态指针来保存唯一实例,创建之前先判断是否已经存在,如果已经创建过了就不再创建. 2.考虑到线程安全和异常安全可以在静态函数中加锁. 3.考虑在合适的时机析构创建的实例,因此在该类中定义一个内嵌类delInstance,然后在singleton中添加一个delInstance的静态成员,在程序运行结束后系统会调用静态成员的析构函数,删除单例的唯一实例. 具体代码

【C++设计模式】单件类与DCLP(Double Check Lock Pattern)的风险

[单件类] 保证只能有一个实例化对象,并提供全局的访问入口. [设计注意事项] 1.阻止所有实例化的方法: private 修饰构造函数,赋值构造函数,赋值拷贝函数. 2.定义单实例化对象的方法: a.使用static 修饰 b.使用new+delete的方法 3.多线程版本: 使用双检测锁定,即先检测单实例对象是否存在:不存在,使能"锁",再次判断实例是否存在,不存在就创建该单实例对象. A.单层锁示例: Singleton* Singleton::getInstance() { L

多线程下的单例-double check

话不多说直接上代码: public sealed class Singleton { private static Singleton _instance = null; // Creates an syn object. private static readonly object SynObject = new object(); Singleton() { } public static Singleton Instance { get { // Double-Checked Lockin

java后端研发经典面试题总结

垃圾回收算法 1.标记-清除算法 标记-清除算法是最基本的算法,和他的名字一样,分为两个步骤,一个步骤是标记需要回收的对象.在标记完成后统一回收被标记的对象.这个算法两个问题.一个是效率问题,标记和清除的效率不高.第二个问题是标记-清除之后会有大量不连续的碎片空间,如果我们需要更大的连续内存就必须GC. 2.复制算法 复制算法,不同于标记-清除,复制算法大多数用于新生代,它需要大小相等的两块内存,每次只使用一块内存,当GC的时候会把这块内存存活的对象复制到另外一块内存上面,解决了时间效率和空间碎