`
zhangle
  • 浏览: 26604 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

Java的singleton模式的double-check问题

    博客分类:
  • Java
阅读更多
以下是double-checked locking的java代码:
public class Singleton {
    private Singleton instance = null;
    public static Singleton getInstance() {
        if (instance == null) {
            synchronized(this) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}


但double-check在J2SE 1.4或早期版本在多线程或者JVM调优时由于out-of-order writes,是不可用的。

这个问题在J2SE 5.0中已经被修复,可以使用volatile关键字来保证多线程下的单例。
public class Singleton {
    private volatile Singleton instance = null;
    public Singleton getInstance() {
        if (instance == null) {
            synchronized(this) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}


推荐方法是Initialization on Demand Holder(IODH),详见http://en.wikipedia.org/wiki/Initialization_on_demand_holder_idiom

public class Singleton {
    static class SingletonHolder {
        static Singleton instance = new Singleton();
    }
    
    public static Singleton getInstance(){
        return SingletonHolder.instance;
    }
}
分享到:
评论
1 楼 kaneg 2008-11-27  
楼主的代码有问题:

public Singleton getInstance() {....}

要实现单例模式,这里应该要加static修饰符。

相关推荐

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

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

    java设计模式----单例模式

    在实际应用中,有一种改进的懒汉模式,称为双重检查锁定(Double-Check Locking),它在保证线程安全的同时,提高了性能。这种方式在`getInstance()`方法中添加了额外的检查,确保只有在实例真正为null时才进行同步...

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

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

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

    Java设计模式是面向对象编程中的重要概念,它们是解决常见问题的经验总结,为代码的可重用性、可维护性和可扩展性提供了指导。这里我们将深入探讨三种常见的Java设计模式:单例(Singleton)、工厂方法(Factory ...

    singleton设计模式java实现及对比

    在Java中,Singleton模式的实现有多种方式,每种方式都有其优缺点,我们将详细探讨这些实现方法并进行对比。 ### 1. 饿汉式(Static Final Field) 这是最简单的Singleton实现方式,通过静态初始化器在类加载时就...

    java-thread-safe-singleton-pattern.rar_starvation

    上述代码是典型的双检锁/双重校验锁(DCL,Double-Check Locking)单例模式,它结合了静态内部类和 volatile 关键字来实现延迟加载和线程安全,避免了饥饿问题。 **延迟加载(Lazy Initialization)**: 延迟加载是...

    java单例设计模式-饿汉式-懒汉式.pdf

    除了同步方法,Java 还提供了双重检查锁定(Double-Check Locking)策略,这是一种更高效的懒汉式实现方式,它减少了同步的范围: ```java public class Singleton { private volatile static Singleton instance;...

    java单例设计模式-饿汉式-懒汉式 (2).docx

    为了解决性能问题,可以使用双重检查锁定(Double-Check Locking)优化懒汉式单例: ```java public class Singleton { private volatile static Singleton instance; private Singleton() {} public static ...

    java单例设计模式-饿汉式-懒汉式 (2).pdf

    ### 双重检查锁定(Double-Check Locking) 为了提高性能,我们可以使用双重检查锁定来进一步优化懒汉式。这种方法只在真正需要创建实例时进行同步,其余时间则不进行同步。代码如下: ```java public class ...

    java单例设计模式-饿汉式-懒汉式[参照].pdf

    为了解决懒汉式的线程安全问题,可以采用双重检查锁定(Double-Check Locking)策略,这是一种更高效的实现方式: ```java public class Singleton { private volatile static Singleton instance; private ...

    java代码-double check单例模式

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

    java单例模式实例

    接下来是**双重检查锁定(Double-Check Locking)**,它结合了懒汉式和饿汉式的优点,既延迟初始化,又保证了线程安全。代码如下: ```java public class Singleton { private volatile static Singleton instance...

    (创建型模式)Singleton模式

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

    singleton_单例模式_java_设计模式_

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

    Java面向对象(高级)- 单例(Singleton)设计模式

    为了避免懒汉式的同步开销,还可以采用双重检查锁定(Double-Check Locking)或者静态内部类的方式实现线程安全的懒汉式。 单例模式的优点包括: - 资源共享,节省内存。 - 控制实例的产生,避免过多的实例导致的...

    java设计模式之单例模式.zip

    Java设计模式是面向对象编程中的重要概念,它们是软件开发中经过验证的、解决常见问题的最佳实践。在这些模式中,单例模式是最为广泛使用的一种。单例模式确保一个类只有一个实例,并提供一个全局访问点,使得在整个...

    java设计模式高清教程

    比如,在使用单例模式时,可能会讨论线程安全问题和双重检查锁定(Double-Check Locking);在介绍装饰器模式时,可能会讲解如何动态地增加或改变对象功能,以及与继承的比较;在探讨观察者模式时,会讲解事件驱动...

    设计模式详解-JAVA语言实现

    在Java中,有多种实现单例的方式,包括饿汉式、懒汉式、双重检查锁定(Double-Check Locking)以及枚举单例。 2. 工厂模式:提供一个接口来创建对象,但让子类决定实例化哪一个类。Java中的Abstract Factory和...

    Singleton 单例模式

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

Global site tag (gtag.js) - Google Analytics