`
dr2tr
  • 浏览: 142241 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Singleton和Double Check

阅读更多

首先看一段比较经典的代码:

public static Singleton getInstance()
{
  
if (instance == null) //0
  {
    
synchronized(Singleton.class) {  
      if (instance == null)          
        instance = new Singleton();  
    }
  }
  
return instance;
}

在这段代码里,对instance == null 的两次检查就是我们所说的Double Check. 而对于为什么要做两次,网上的资料不胜枚举,这里就不多说了。

现在的问题是,这样的double check 并不能保证线程安全。

关键在于Java 变量初始化以及赋值的顺序。简单地说,上面的程序中, instance = new Singleton() 这一句的操作过程是这样的:

1。 为instance 分配空间

2。 将instance 指向港分配的空间

3。 为instance 赋值

可以看到,如果在完成步骤2 的时候,有一个新线程进入到上面程序中注0 的地方。那么,将会发生的情况是不可预料的。

道理很简单。可惜以讹传讹的情况在网上太多了。

至于解决方法,只有定义实例变量的时候就完成初始化和赋值。比如:

class Singleton
...{
  
private Vector v;
  
private boolean inUse;
  
private static Singleton instance = new Singleton();

  
private Singleton()
  
...{
    v 
= new Vector();
    inUse 
= true;
    
//...
  }


  
public static Singleton getInstance()
  
...{
    
return instance;
  }

}

或者,老老实实用synchronized 方法吧。

REF: http://www.ibm.com/developerworks/library/j-dcl.html

 

 

分享到:
评论
1 楼 dr2tr 2008-08-27  
刚看到eye上面另一位老兄的文章,http://lucaslee.iteye.com/blog/211471, 对于out-of-order writes,有一个可能的解决办法,“对32位的原始类型的Double-checked locking是可以的”。REF:http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html

相关推荐

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

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

    java代码-double check单例模式

    在Java中,实现单例模式有多种方式,其中“double check”(双重检查锁定)是线程安全的单例模式实现之一,它兼顾了性能和线程安全性。 首先,我们要理解为什么需要双重检查锁定。在早期的Java版本中,由于JVM的...

    Singleton

    5. 双重检查锁定(DCL,Double-Check Locking): 在懒汉式的基础上,进一步优化,减少同步的开销。只有在INSTANCE为null时,才进行同步,这样大多数情况下都不需要同步。 ```java public class Singleton { ...

    singleton设计模式java实现及对比

    双重检查锁定(Double-Check Locking) 这种方法结合了前两种方式的优点,既延迟初始化又避免了不必要的同步。 ```java public class Singleton { private volatile static Singleton instance; private ...

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

    问题在于,由于Java内存模型的细节,原始的Double-check模式可能会出现线程可见性问题和指令重排序问题。线程可见性问题指的是当一个线程修改了共享变量,其他线程可能无法立即看到更新。指令重排序则可能导致初始化...

    Singleton 单例模式

    3. 双重检查锁定(Double-Check Locking): 结合了懒汉式的延迟初始化和饿汉式的线程安全性,避免了不必要的同步开销。 ```java public class Singleton { private volatile static Singleton instance; ...

    (创建型模式)Singleton模式

    3. 双重检查锁定(DCL,Double Check Locking): 这种方式在保证线程安全的同时,也延迟了Singleton实例的创建。这种方式在多线程环境下是安全的,同时也避免了不必要的实例化。 ```java public class Singleton ...

    单例模式Singleton

    为了兼顾性能和线程安全,可以使用双重检查锁定(Double-Check Locking): ```java public class Singleton { private volatile static Singleton instance = null; private Singleton() {} public static ...

    Java常用设计模式(SingleTon、FactoryMethod、AbstractFactory)

    Java中常使用双重检查锁定(Double-Check Locking)或枚举方式来实现线程安全的单例。 ```java // 双重检查锁定示例 public class Singleton { private volatile static Singleton instance; private Singleton...

    单例实现源码singleton-C++

    2. **双重检查锁定(Double-Check Locking)** 这种方法在多线程环境中更为适用,它避免了无谓的同步开销。代码如下: ```cpp class Singleton { private: Singleton() {} ~Singleton() {} Singleton(const ...

    singleton面试题转

    2. **双重检查锁定(Double-Check Locking)** 这种方式在多线程环境下使用,它实现了延迟初始化并且是线程安全的。在getInstance()方法中,首先检查实例是否已经创建,如果没有,则进行同步锁定,然后再次检查实例...

    单例模式(Singleton)的6种实现

    4. **双重检查锁定(DCL,Double Check Locking)** DCL在保证线程安全的同时,尽量减少同步的使用。只有在真正创建实例时才进行同步。 ```java public class Singleton { private volatile static Singleton ...

    设计模式之Singleton(单态)

    双重检查锁定(DCL,Double-Check Locking) ```java public class Singleton { private volatile static Singleton instance = null; private Singleton() {} public static Singleton getInstance() { ...

    Singleton 单件(创建型模式)

    为了解决这个问题,可以采用双重检查锁定(Double-Check Locking)机制,代码如下: ```java public class Singleton { private volatile static Singleton instance; private Singleton() {} public static ...

    linux下线程安全的singleton模板

    2. **双重检查锁定(Double-Check Locking)**:这是一种经典的线程安全Singleton实现方法。在C++中,我们首先声明一个指向Singleton实例的指针,然后在多线程环境下使用互斥锁(mutex)进行保护。当第一次检查发现...

    C#设计模式之Singleton模式

    ### 双重检查锁定(Double-Check Locking) 还有一种更高效的线程安全实现方式是双重检查锁定(DCL): ```csharp class Singleton { private volatile static Singleton _Instance; private Singleton() { } ...

    singleton_单例模式_java_设计模式_

    3. 双重检查锁定(Double-Check Locking): 这种方式解决了懒汉式的性能问题,只在真正需要创建实例时进行同步。代码如下: ```java public class Singleton { private volatile static Singleton instance; ...

    singleton.zip单例的几种实现demo,

    3. **双检锁/双重校验锁(Double-Check Locking,DCL)**: 这是懒汉式的优化版本,既保证了线程安全,又避免了同步带来的性能问题。核心在于两次检查`instance`是否为null,确保单例的唯一性: ```java public ...

    设计模式 之 “单例模式[Singleton Pattern]”

    3. **双重检查锁定(Double-Check Locking)**:在懒汉式的优化版本中,加入了 volatile 和 synchronized 关键字,确保了线程安全和单例的正确初始化。 ```java public class Singleton { private volatile static...

Global site tag (gtag.js) - Google Analytics