`

单例设计模式(转)

阅读更多

原文地址:http://droidyue.com/blog/2015/01/11/looking-into-singleton/

 

一,概念

单例模式:指的是一个类只有一个实例,并且提供一个全局访问点。

 

二,实现思路

1,基本思路:

        1)在单例的类中设置一个private静态变量Instance,Instance类型为当前类,用来持有单例唯一的实例

        2)将(无参数)构造器设置为private的,避免外部使用new构造多个实例

        3)提供一个public的静态方法,如getInstance,用来返回该类的唯一实例Instance

(上面提到的思路的单例实例可以有以下几种创建形式,每一种实现都需要保证实例的唯一性!)

 

2,饿汉式:

        1)饿汉式指的是单例的实例在类装载时进行创建。如果单例类的构造方法中没有包含过多的操作处理,饿汉式其实是可以接受的。

        2)饿汉式的常见代码如下,当SingleInstance类加载时会执行

private static SingleInstance Instance = new SingleInstance(); 

初始化了唯一的实例,然后getInstance()直接返回Instance即可。

public class SingleInstance {
  private static SingleInstance Instance = new SingleInstance();
  
  private SingleInstance() {
  }
  
  public static SingleInstance getInstance() {
      return Instance;
  }
}

        3)饿汉式的问题——如果构造方法中存在过多的处理,会导致加载这个类时比较慢,可能引起性能问题+如果使用饿汉式的话,只进行了类的装载,并没有实质的调用,会造成资源的浪费。

 

3,懒汉式:

        1)懒汉式指的是单例实例在第一次使用时进行创建。这种情况下避免了上面饿汉式可能遇到的问题。但是考虑到多线程的并发操作,我们不能简简单单地像下面代码实现。

public class SingleInstance {
  private static SingleInstance Instance;
  private SingleInstance() {
  }
  
  public static SingleInstance getInstance() {
      if (null == Instance) {
          Instance = new SingleInstance();
      }
      return Instance;
  }
}

        2)上述的代码在多个线程密集调用getInstance时,存在创建多个实例的可能。比如线程A进入null==Instance这段代码块,而在A线程未创建完成实例时,如果线程B也进入了该代码块,必然会造成两个实例的产生。

 

4,synchronized修饰方法:

        1)使用synchronized修饰getInstance方法可能是最简单的一个保证多线程保证单例唯一性的方法。synchronized修饰的方法后,当某个线程进入调用这个方法,该线程只有当其他线程离开当前方法后才会进入该方法。所以可以保证getInstance在任何时候只有一个线程进入。

public class SingleInstance {
  private static SingleInstance Instance;
  private SingleInstance() {
  }
  
  public static synchronized SingleInstance getInstance() {
      if (null == Instance) {
          Instance = new SingleInstance();
      }
      return Instance;
  }
}

        2)但是使用synchronized修饰getInstance方法后必然会导致性能下降,而且getInstance是一个被频繁调用的方法。虽然这种方法能解决问题,但是不推荐。

 

5,双重检查加锁:

        1)使用双重检查加锁,首先进入该方法时进行null==Instance检查,如果第一次检查通过,即没有实例创建,则进入synchronized控制的同步块,并再次检查实例是否创建,如果仍未创建,则创建该实例。

        2)双重检查加锁保证了多线程下只创建一个实例,并且加锁代码块只在实例创建的之前进行同步。如果实例已经创建后,进入该方法,则不会执行到同步块的代码。

public class SingleInstance {
  private static volatile SingleInstance Instance;
  private SingleInstance() {
  }
  
  public static SingleInstance getInstance() {
      if (null == Instance) {
          synchronized (SingleInstance.class) {
              if (null == Instance) {
                  Instance = new SingleInstance();
              }
          }
      }
      return Instance;
  }
}

 

6,利用static机制:

        在Java中,类的静态初始化会在类被加载时触发,我们利用这个原理,可以实现利用这一特性,结合内部类,可以实现如下的代码,进行懒汉式创建实例。

public class SingleInstance {
  private SingleInstance() {
  }
  
  public static SingleInstance getInstance() {
      return SingleInstanceHolder.Instance;
  }
  
  private static class SingleInstanceHolder {
      private static SingleInstance Instance = new SingleInstance();
  }
}

 

分享到:
评论

相关推荐

    设计模式之单例模式Java实现和类设计图

    本次我们将深入探讨两种设计模式——单例模式和装饰模式,它们在Java编程中都有着广泛的应用。 首先,让我们来理解“单例模式”。单例模式是一种创建型设计模式,其核心思想是保证一个类只有一个实例,并提供一个...

    javaweb项目+设计模式(单例模式,工厂模式,动态代理,适配器)

    本项目涵盖了四种常见的设计模式:单例模式、工厂模式、动态代理和适配器模式。下面将详细阐述这四种设计模式的概念、作用以及在实际项目中的应用。 **1. 单例模式** 单例模式是一种限制类实例化次数为一个的设计...

    c++单例模式线程日志类

    在C++编程中,单例模式是一种常用的软件设计模式,它保证一个类只有一个实例,并提供一个全局访问点。在这个特定的场景中,我们讨论的是一个实现了单例模式的日志类,该类专为多线程环境设计,具备日志等级控制、...

    C#创建窗体的单例模式

    总之,C#中的WinForm窗体单例模式是一种有效的设计模式,它可以帮助我们更好地管理窗体实例,避免资源浪费,同时提高用户体验。在实际项目中,结合适当的场景和需求,灵活运用单例模式可以优化代码结构,提升软件...

    ava常用设计模式-单例模式

    ava常用设计模式-单例模式 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一,有以下特点: 1. 单例类只能有一个实例。 2. 单例类必须自己创建自己的唯一实例。 3. 单例类必须给所有其他对象提供这一...

    设计模式PPT合集

    设计模式是软件工程中的一种最佳实践,它是在特定情境下为了解决常见问题而形成的一套可重用的解决方案模板。这些模式总结了在长期软件开发过程中,人们发现的高效、可靠的代码设计策略。本合集包含的设计模式PPT...

    浅议单例模式之线程安全(转)

    单例模式是软件设计模式中的一种经典模式,它限制了类的实例化,确保一个类在整个应用程序中只有一个实例。在多线程环境下,线程安全的单例模式尤为重要,因为如果不正确实现,可能会导致多个线程同时创建多个实例,...

    第五讲单例模式

    单例模式是设计模式中的重要概念,它在软件开发中被广泛应用,特别是在需要全局唯一实例的场景下。在本讲“第五讲单例模式”中,我们将深入探讨这个模式的原理、实现方式以及其在实际编程中的应用。 单例模式的核心...

    乐在其中设计模式(C#)-单例模式(SingletonPattern)[收集].pdf

    《乐在其中设计模式(C#) - 单例模式(Singleton Pattern)》 单例模式是一种常用的设计模式,其核心思想在于确保一个类在整个应用程序的生命周期中只存在一个实例,并提供一个全局访问点来获取这个唯一的实例。在C#中...

    新技术培训 培训讲义9_设计模式之单例适配器和工厂模式.doc

    在这个文档中,我们关注的是三种设计模式:单例模式、适配器模式和工厂模式。 首先,单例模式是一种确保一个类只有一个实例并提供一个全局访问点的设计模式。这种模式的核心在于控制类的实例化过程,确保在任何情况...

    设计模式:创建型之原型(深浅拷贝)、单例(饿汉式与懒汉式),三大工厂模式 结构型之适配器模式,代理模式(三大代理)

    设计模式是一种用于解决常见软件设计问题的模板,它们是经验丰富的软件工程师在长时间开发中总结出来的最佳实践。设计模式可以分为创建型、结构型和行为型三类,每类都包含多种特定的设计模式,旨在解决特定类型的...

    Android设计模式系列之单例模式

    单例模式是软件设计模式的一种,其主要目的是确保一个类只有一个实例,并且提供一个全局访问点来获取这个实例。在Android系统中,单例模式被广泛应用于管理那些需要全局共享的资源,例如输入法管理者...

    设计模式之里氏转换原则

    设计模式是软件工程中解决常见问题的经验总结,通过模式的应用,可以使代码结构更加清晰,易于维护和扩展。里氏转换原则是设计模式中一个重要的理论基础,它对实现这些模式起到关键的指导作用。 1. **什么是里氏...

    java 23种设计模式.7z

    1. **单例设计模式**:确保一个类只有一个实例,并提供全局访问点。常用于控制共享资源,如数据库连接池。实现方式有饿汉式(静态常量)、懒汉式(线程不安全、线程安全)和双重检查锁定等。 2. **工厂设计模式**:...

    Example-TypeScript-Singleton-Pattern:TypeScript 和单例模式

    单例模式是软件设计模式中的一种,它保证一个类只有一个实例,并提供一个全局访问点。在 TypeScript 中,我们可以利用静态属性和私有构造函数来实现单例模式,从而确保类的唯一性。以下是对这个"Example-TypeScript-...

    winform序列化 md5加密 单例模式(无视频).rar

    4. **单例模式**: 单例模式是一种设计模式,确保一个类只有一个实例,并提供全局访问点。在C#中,通常通过私有构造函数和静态方法来实现单例,以防止其他代码实例化对象。典型的单例实现可能包含`private static`...

    c++设计模式全系列+应用场景+实例说明

    2. **单例模式(Singleton Pattern)**:单例模式是一种创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点。 3. **观察者模式(Observer Pattern)**:观察者模式是一种行为设计模式,定义了对象间的...

    您的设计模式.pdf。

    本书《您的设计模式》对设计模式进行了详细的讲解,涵盖了策略模式、代理模式、单例模式、多例模式、工厂方法模式、抽象工厂模式、门面模式、适配器模式、模板方法模式、建造者模式、桥梁模式、命令模式、装饰模式、...

Global site tag (gtag.js) - Google Analytics