`
hanhg
  • 浏览: 136959 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
社区版块
存档分类
最新评论

Singleton模式及常见问题

阅读更多
1. Singleton模式介绍:

  Singleton模式也成为单件模式,即确保一个类只有一个实例,并提供一个全局的访问点.

类图:

                   Singleton

Static instance

//其他有用的单件数据

Static getInstance()

//其他有用的单件方法


2. Singleton模式的实现:

public class SingletonMethod {

private static SingletonMethod instance = null;



private SingletonMethod(){

       

    }



    public static SingletonMethod getInstance() {

        if (null == instance) {

            instance = new SingletonMethod2();

        }

        return instance;

    }



    /**

     * @param args

     */

    public static void main(String[] args) {

        SingletonMethod test1= SingletonMethod.getInstance();

        SingletonMethod test2= SingletonMethod.getInstance();;

        System.out.println(test1.equals(test2));

        System.out.println(test1.hashCode()==test2.hashCode());

    }



}

实现的说明;构造器是私有的,保证不能被外部类所直接创建.在通过getInstance()来调用时,判断实例是否已经创建,如果没有创建再进行创建.通过测试我们验证了创建2次出的实例确实时一个.真的很简单.那我们还是来看看下面的注意事项吧!

3. Singleton模式的注意事项

上面的实现好像很好,不过上面的做法却不能保障我们每次取到的实例就是一个,那么是什么时候呢?让我们来看看.当我们程序中使用了多线程的时候,确实有创建了两个不同实例的时候,究竟是为什么呢?研究发现,其实有时候会有两个线程同时去访问getInstance(),发现instance为null,那么他们都会去创建这个实例并返回,这样就会产生两个实例了.哈哈,问题找到了,我们要怎么来修改呢?

首先我们想到的是,多线程并发时我们可以使用synchronized的,我们这样来修改一下:

   public static synchronized SingletonMethod2 getInstance() {

        if (null == instance) {

            instance = new SingletonMethod2();

        }

        return instance;

}

问题得到解决了,可以仔细考虑时我们发现,还有一个比较严重的问题,只有第一次执行此方法才需要同步,那么我们每次都来同步它,一定会降低效率的.如果您能接收这样的处理负担,那么这样的方法还是很好的,简单有效.

那么有办法改善多线程嘛?参见以下处理方法:

1. 使用”急切”创建实例,二不用延迟实例化的做法

public class SingletonTest {

    private SingletonTest() {

    }

    private static SingletonTest instance = new SingletonTest();

    public static SingletonTest getInstance() {

        return instance;

    }

    public static void main(String[] args) {

        SingletonTest test1= SingletonTest.getInstance();

        SingletonTest test2= SingletonTest.getInstance();;

        System.out.println(test1.equals(test2));

        System.out.println(test1.hashCode()==test2.hashCode());

    }

}

2. 使用”双重加锁”的办法

  private volatile static SingletonMethod2 instance = null;



    public static SingletonMethod2 getInstance() {

        if (null == instance) {

            synchronized (SingletonMethod2.class) {

                if (null == instance) {

                    instance = new SingletonMethod2();

                }

            }



        }

        return instance;

    }

Volatile 关键字确保,当instance变量被初始化为singleton实例时,多个线程能正确地处理instance变量.

注:双重加锁不适用于1.4及更早的JDK.

总结一些吧:其实大多数人都了解singleton模式,在使用的过程中也都用过,不过你们注意了这些可能的问题了嘛?

分享到:
评论

相关推荐

    C++完美实现Singleton模式

    在C++中,最简单也是最常见的Singleton模式实现方式如下所示: ```cpp class Singleton { public: static Singleton* Instance() { if (_instance == nullptr) { _instance = new Singleton; } return _...

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

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

    (创建型模式)Singleton模式

    下面我们将详细介绍Singleton模式的几种常见实现方式: 1. 饿汉式(静态常量): 在类加载时就完成了初始化,因此这种方法是线程安全的。但是,由于类加载较早,即使尚未使用Singleton,也会创建实例,造成内存...

    Java的Singleton模式代码(免资源分)

    ### Java的Singleton模式详解 #### 一、Singleton模式概述 Singleton模式是一种常用的设计模式,在Java中主要用于确保一个类只有一个实例,并提供一个全局访问点。这种模式对于管理共享资源(如数据库连接池、...

    设计模式 创建型模式 Singleton模式(单键)

    很多时候我们都会需要Singleton模式,最常见的比如我们希望整个应用程序中只有一个连接数据库的Connection实例;又比如要求一个应用程序中只存在某个用户数据结构的唯一实例。我们都可以通过应用Singleton模式达到...

    Singleton模式源程序

    描述中提到的“多线程的实现”意味着Singleton模式需要考虑线程安全问题。在多线程环境中,如果没有正确的同步机制,可能会出现多个线程同时创建Singleton实例的情况。解决这个问题的方法有几种: 1. 静态初始化:...

    Java线程安全的Singleton模式:深入分析与实现

    在Java编程中,Singleton模式是一种常用的设计模式,它确保一个类只有一个实例,并提供一个全局访问点。...正确实现Singleton模式,可以提高程序的稳定性和可维护性,避免多线程环境下的资源竞争和实例重复创建问题。

    深入浅出单例Singleton模式

    【深入浅出单例Singleton模式】 单例模式是一种在软件设计中常见的设计模式,它的核心目标是确保一个类只有一个实例,并提供一个全局访问点。在Java等面向对象编程语言中,单例模式常用于控制资源的共享,如全局...

    C#面向对象设计模式纵横谈-1.Singleton 单件(创建型模式)

    在C#编程中,面向对象设计模式是一种组织代码和解决常见设计问题的模板。Singleton模式是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来获取这个唯一的实例。这种模式在需要控制资源的唯一...

    Android Singleton单例模式Demo

    在Android中,Singleton模式的应用场景包括但不限于: 1. 应用程序配置管理:例如,一个AppConfig类用于存储和管理应用的全局配置信息。 2. 数据库连接管理:在多线程环境下,共享数据库连接池以提高性能和减少资源...

    singleton单例模式

    - `singleton.cpp`包含了单例类的实现,可能包括了上述的某一种或多种单例模式的实现。 - `main.cpp`是程序的入口,可能会在其中调用单例对象进行测试。 - `mainwindow.cpp`和`mainwindow.h`可能是UI界面的实现和...

    设计模式之Singleton

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

    设计模式C++学习之单例模式(Singleton)

    单例模式的核心在于控制类的实例化过程,防止多处代码创建多个实例导致资源的浪费或者状态不一致的问题。在C++中,通常通过以下步骤来实现: 1. **私有化构造函数**:为了确保外部不能直接通过new关键字实例化单例...

    单例模式Singleton

    在Java中,单例模式的实现方式多种多样,但常见的有饿汉式(Eager Initialization)和懒汉式(Lazy Initialization)两种。 1. **饿汉式**: 饿汉式是在类加载时就完成了初始化,所以类加载比较慢,但获取对象的...

    C#面向对象设计模式纵横谈(2):Singleton 单件(创建型模式)

    本篇文章将深入探讨C#中的Singleton模式,包括其原理、实现方式以及适用场景。 首先,Singleton模式的核心思想是限制类的实例化过程,只允许类的内部创建一个实例,并通过静态方法或属性暴露给外部。这样做的好处...

    单例模式 Singleton Pattern

    ### 单例模式 Singleton Pattern #### 概述 单例模式是一种常见的设计模式,属于创建型模式之一。这种模式的核心在于确保某个类只有一个实例存在,并且提供一个全局访问点来获取该实例。单例模式在Java开发中尤其...

    Singleton 单件(创建型模式)

    设计模式是解决常见软件设计问题的模板,Singleton 模式是其中最基础、最常用的一种。通过深入理解并恰当运用 Singleton,我们可以提高代码的可维护性和可复用性。在实际开发中,要根据项目需求和场景选择合适的 ...

    C++设计模式代码资源12_Singleton.zip

    总的来说,Singleton模式在C++中是一种常见且重要的设计模式,它通过控制类的实例化数量,提供了全局访问点,有助于管理资源和协调系统组件。然而,使用时也需谨慎,以免引入不必要的复杂性和耦合。

    Head First 设计模式 (五) 单件模式(Singleton pattern) C++实现

    单件模式(Singleton pattern)是设计模式中的一种结构型模式,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式常用于系统中需要频繁创建和销毁的对象,如日志服务、线程池或者数据库连接等...

Global site tag (gtag.js) - Google Analytics