`
阅读更多
单例模式:
作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。


单例模式的特点:
单例类只能有一个实例。
单例类必须自己创建自己的唯一实例。
单例类必须给所有其他对象提供这一实例。


单例模式是最简单的设计模式,但是完全使用java构造一个线程安全的高效的单例,是需要有一定线程安全理论基础的,甚至需要理解java的内存模型!

JDK中的使用案例:
java.lang.Runtime
java.lang.NumberFormat

下面是三种最常用的构造单例的形式,并一一分析使用场景!

1、非延迟加载的单例类(饿汉式单例类)。
/**
 * 非延迟加载(这种是比较建议的,但是会造成启动较慢,不过线程安全,思路也简单)
 * @author xinchun.wang
 *
 */
public class SingletonDesign {
    private static SingletonDesign instance = new SingletonDesign();

    /**
     * 必须为私有
     */
    private SingletonDesign(){
        
    }
    
    /**
     * 必须为静态
     * @return
     */
    public static SingletonDesign getInstance() {
        return instance;
    }
}


2、二次检查的方式(DCL)。

/**
 * 延迟加载(二次检查的方式)
 * @author xinchun.wang
 * 
 */
public class SingletonDesignDoubleCheck {
    /**
     * 此处必须由volatile 修饰
     */
    private volatile static SingletonDesignDoubleCheck instance = null;

    /**
     * 必须为私有
     */
    private SingletonDesignDoubleCheck() {

    }

    /**
     * 必须为静态
     * 
     * @return
     */
    public static SingletonDesignDoubleCheck getInstance() {
        if (instance == null) {
            synchronized (SingletonDesignDoubleCheck.class) {
                //必须再次判断,已防止多次实例化
                if(instance == null){
                    instance = new SingletonDesignDoubleCheck();
                }
            }
        }
        return instance;
    }
}

此处重点要理解 为什么instance 要用volitile修饰,大家都知道volitile 实现的效果有:内存可见性,代码重排序。那么此处是用到那个效果呢?

其实此处最重要的是重排序,而非内存可见性:即使没有保证内存可见性的效果,最多也就是再次进入synchronized 块,内部仍然是可以确保逻辑的正确性的。当然内存可见性可以确保写线程写入后,读线程立即可以看到而不用再次获取SingletonDesignDoubleCheck.class锁 ,效率更高。

此处的重排序关键是搞清楚到底是那段代码的重排序,以及导致什么样的一个效果?
答案是:instance 赋值指令 和  SingletonDesignDoubleCheck 构造函数里成员常量的重排序,非法的效果是:赋值在前,初始化在后,这样赋值的instance是没有完全初始化的,其他线程就会看到不完整的instance实例!!!  
这样的分析,不知道您是否理解~    

3、利用了java的类加载机制的一个实现(这个是实际应用中最推荐的方式,但是这种方式在某些需要定期更新的需求,是做不到的,必须求救于DCL的方式)
/**
 * holder方式(这种方式主要是利用了java的类加载机制)
 * @author xinchun.wang
 *
 */
public class SingletonDesignByHolder {
    private static class SingletonDesignHolder{
        private static final SingletonDesignByHolder instance = new SingletonDesignByHolder();
    }

    /**
     * 必须为私有
     */
    private SingletonDesignByHolder(){
        
    }
    
    /**
     * 必须为静态
     * @return
     */
    public static SingletonDesignByHolder getInstance() {
        return SingletonDesignHolder.instance;
    }
}
0
6
分享到:
评论

相关推荐

    设计模式-Singleton与Factory

    设计模式-Singleton与Factory

    大话设计模式--Singleton(单例模式)

    单例模式是软件设计模式中的一种经典模式,它在许多场景下被广泛使用,尤其是在需要全局唯一实例的情况下。本文将深入探讨单例模式的概念、作用、实现方式以及其在实际编程中的应用。 单例模式的核心思想是确保一个...

    23种设计模式-C_版本

    设计模式 - Singleton Pattern 在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性、以及良好的效率。这就是 Singleton Pattern 的设计动机。 Singleton ...

    C++设计模式--基于Qt4开源跨平台开发框架

    《C++设计模式--基于Qt4开源跨平台开发框架》一书主要探讨了如何在C++编程中利用设计模式,并结合Qt4框架进行高效的跨平台应用开发。设计模式是软件工程中的重要概念,它们是经过时间和实践验证的解决特定问题的模板...

    PyPI 官网下载 | dask-actor-singleton-1.1.0.tar.gz

    单例模式是一种设计模式,它确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。在多线程或多进程环境中,单例模式可以避免因创建多个实例而导致的资源浪费或状态不一致的问题。在Python中,实现单例通常...

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

    这里我们将深入探讨三种常见的Java设计模式:单例(Singleton)、工厂方法(Factory Method)和抽象工厂(Abstract Factory)。 **单例模式(Singleton)** 单例模式确保一个类只有一个实例,并提供一个全局访问点...

    C#设计模式-吕震宇

    C#设计模式(7)-Singleton Pattern C#设计模式(6)-Abstract Factory Pattern C#设计模式(5)-Factory Method Pattern C#设计模式(4)-Simple Factory Pattern C#设计模式(3) - 设计原则(2) C#设计模式(2...

    MyDemo-qt-singleton.7z

    本项目"MyDemo-qt-singleton"着重展示了如何在QT环境中实现单例设计模式。单例模式是一种保证一个类只有一个实例并提供一个全局访问点的设计模式,常用于控制共享资源的访问,如数据库连接、配置文件或线程池。 在...

    Laravel开发-singleton-pattern

    在Laravel框架中,设计模式的应用是提升代码质量和可维护性的重要手段之一,而Singleton(单例模式)是其中一种常见的模式。Singleton确保一个类只有一个实例,并提供一个全局访问点,这样可以避免创建多个对象导致...

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

    在Java编程语言中,设计模式是一种经过验证的解决常见软件设计问题的最佳实践。单例模式是其中最常用的一种,它的核心思想是确保一个类只有一个实例,并提供全局访问点。单例模式的应用场景包括:控制资源的访问、...

    设计模式精解-GoF-23种设计模式解析--附C++源代码

    设计模式是软件工程中的一种最佳实践,用于解决在软件开发过程中常见的问题。这些模式是由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位大师,通常被称为GoF(Gang of Four),在他们的经典著作...

    JAVA设计模式-chm版

    Java设计模式是软件开发中的一种最佳实践,它总结了在解决特定问题时程序员们经常采用的有效方法。这个“JAVA设计模式-chm版”资源显然包含了关于Java设计模式的详细信息,便于理解和应用。设计模式是对常见问题的...

    设计模式复习题.doc

    "设计模式复习题.doc" 以下是根据给定文件生成的相关知识点: 1. 设计模式的种类: - 工厂方法模式 - 抽象工厂模式 - 单件模式 - 组合模式 - 外观模式 - 观察者模式 - 模板方法模式 - 迭代器模式 - 代理...

    17-SingleTon.rar

    单例设计模式是一种在计算机编程中广泛使用的设计模式,它保证了一个类只有一个实例,并提供一个全局访问点。这种模式在需要频繁创建和销毁对象,或者对象创建代价较大,且需要全局共享资源的情况下非常有用。例如,...

    java-thread-safe-singleton-pattern.rar_starvation

    在Java编程中,单例模式是一种常用的创建型设计模式,用于确保一个类只有一个实例,并提供一个全局访问点。本主题探讨的是线程安全的单例模式实现,特别是饥饿模式(Starvation)和延迟加载(Lazy Initialization)...

    《设计模式--基于C#的工程化实现及扩展》.(王翔)_《0528》.rar

    《设计模式--基于C#的工程化实现及扩展》是一本深入探讨软件设计模式的书籍,作者王翔通过C#语言来阐述各种设计模式的工程化应用和拓展。设计模式是软件开发中的一种最佳实践,它总结了在特定场景下解决常见问题的...

    26种设计模式-----pdf

    设计模式是软件工程中的一种最佳实践,它是在特定上下文中解决常见问题的模板。这个压缩包文件名为"26种设计模式",其中可能详细介绍了软件开发中的26个核心设计模式。这些模式是经过时间检验、被广泛接受并反复使用...

    设计模式-王翔 全本

    《设计模式-王翔 全本》是一本深入探讨软件设计模式的重要著作,作者王翔在书中详尽地阐述了设计模式的理论基础与实践应用。设计模式是软件工程中的重要概念,它代表了在特定情境下,经过时间检验、可复用的解决方案...

    设计模式之Singleton

    **设计模式之Singleton(单例模式)** 在软件工程中,设计模式是解决常见问题的模板,它们代表了经过时间考验的最佳实践。Singleton模式是一种创建型设计模式,它保证一个类只有一个实例,并提供一个全局访问点来...

Global site tag (gtag.js) - Google Analytics