`

设计模式之单例模式

阅读更多

什么是单例模式?

       单例模式:确保一个类只有一个实例,并提供一个全局访问点。

使用场景:

       线程池(threadpool),缓存(cache),对话框,处理偏好设置和注册表(registry)的对象,日志对象,充当打印机,显卡等设备的驱动程序的对象。 事实上这类对象只能有一个实例,如果制造出多个实例,就会导致许多问题产生。例如:程序的行为异常、资源使用过量,或者是不一致的结果。

经典单例模式实现:

public class Singleton{

      private static Singleton uniqueInstance;

      

      private Singleton() {}

      

      public static Singleton getSingleton() {

           if (uniqueInstance== null) {

               uniqueInstance = new Singleton();

           }

           return uniqueInstance ;

      }

     //其它有用的方法

}

 

咋一看上面代码已实现单例模式定义的两个条件: 1.只有一个实例(private static SingleTon uniqueInstance) 2.提供了一个全局访问点( public static getSingleton() 

 

问题来了:当是多线程的情况怎么办呢?具体问题就不多说了,就是代码方法调用的先后顺序,对应的业务就不对了。

大伙可能立马想到的是加synchronized同步方法,是了只要把getInstance()变成同步(synchronized)方法,多线程灾难就可以轻而易举的解决了(代码如下):

public class Singleton {

      private static Singleton uniqueInstance;

      

      private Singleton() {}

      public static synchronized Singleton getSingleton() {

           if (uniqueInstance== null) {

               uniqueInstance = new Singleton();

           }

           return uniqueInstance ;

      }

     //其它有用的方法

}

 

看到这块儿,可能有的同学会说了,同步getInstance()的做法交拖垮性能,该怎么办呢?

1.如果getInstance()的性能对应用程序不是很关键,就什么都别做

2.使用“急切”创建实例,而不用延迟实例化的做法

public class Singleton {

      private static Singleton uniquerInstance = new Singleton();

      

      private Singleton(){}

      

      public static Singleton getInstance() {

            return uniqueInstance;

      }

}

利用这个做法,我们依赖JVM在加载这个类时,马上创建此唯一的实例。JVM保证在任何线程访问uniqueInstance静态变量之前,一定先创建此实例。

3.用”双重检查加锁“,在getInstance()中减少使用同步

利用双重检查加锁(double-checked locking),首先检查是否实例已经创建了,如果尚未创建,“才”进行同步。

public class Singleton {

      private volatile static Singleton uniquerInstance = new Singleton();

      

      private Singleton(){}

      

      public static Singleton getInstance() {

            if (uniqueInstance == null) {

                 synchronized (Singleton.class) {

                      if (uniqueInstance == null) {

                            uniquerInstance = new Singleton();

                      }

                  }

            }

            return uniqueInstance;

      }

}

如果性能是你关心的重点,那么这个做法可以帮你大大地减少getInstance()的时间耗费。

 

注意:

    双重检查加锁不适用于1.4及更早版本的Java!

    在1.4及更早版本的java中,许多JVM对于volatile关键字的实现会导致双重检查加锁的失效。如果你不能用Java5,而必须使用旧版的Java,就请不要利用此技艺实现单例模式。

分享到:
评论

相关推荐

    Java设计模式之单例模式的七种写法

    Java设计模式之单例模式的七种写法 单例模式是一种常见的设计模式,它确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机的驱动程序对象常...

    python 设计模式之单例模式

    python 设计模式之单例模式

    设计模式之单例模式详解.pdf

    设计模式之单例模式详解 单例模式是一种常用的软件设计模式,其定义是单例对象的类只能允许一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。 单例模式的实现主要是...

    研磨设计模式之单例模式

    通过研磨设计模式之单例模式的资料,你可以深入理解单例模式的原理、实现方式及其优缺点,进一步提升自己的编程技能和设计思维。学习并熟练掌握设计模式,对于成为一名优秀的Java开发者至关重要。

    java设计模式之单例模式详解

    Java设计模式之单例模式详解 一、单例模式概览 单例模式(Singleton Pattern)是面向对象设计模式中的一种,属于创建型模式。它确保一个类仅有一个实例,并提供一个全局访问点来访问该实例。单例模式的核心在于控制...

    设计模式之单例模式(结合工厂模式)

    单例模式是软件设计模式中的一种经典模式,它保证了类只有一个实例存在,并提供一个全局访问点。在Java等面向对象编程语言中,单例模式常用于管理共享资源,如数据库连接池、线程池或者配置文件等。结合工厂模式,...

    php设计模式之单例模式_.docx

    ### PHP设计模式之单例模式详解 #### 一、引言 在软件工程领域,设计模式是一种被广泛接受的解决方案,用于解决特定类型的问题。PHP作为一种流行的服务器端脚本语言,同样可以从这些设计模式中受益。本文将详细介绍...

    JAVA设计模式之单例模式(完整版)1[定义].pdf

    JAVA设计模式之单例模式(完整版)1[定义].pdf

    23钟设计模式之单例模式

    单例模式是一种常用的设计模式,它的核心思想是在整个应用程序中,一个类只能有一个实例存在。单例模式常用于控制资源的共享,例如数据库连接池、日志服务等。单例模式有多种实现方式,常见的包括懒汉式、饿汉式以及...

    设计模式之单例模式和工厂模式

    细心整合和单例模式和工厂模式的几种模型,懒汉式,饿汉式,如何并发操作模式,等都有详细讲解

    设计模式之单例模式.md

    设计模式之单例模式,单列模式的几种实现形式,以及其优缺点,还有就是示例,对初步了解单列模式的有所帮助

    设计模式之单例模式.pptx

    单例模式是一种常用的软件设计模式,其定义是单例对象的类只能允许一个实例存在。 许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。 比如在某个服务器程序中,该服务器的配置信息存放...

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

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

    Java设计模式之单例模式

    目录 单例模式的概念 单例模式的要点 单例模式类图 单例模式归类 单例模式的应用场景 单例模式解决的问题 单例模式的实现方式 单例模式实现方式对比 单例模式的概念 单例模式,顾名思义就是只有一个实例,并且由它...

Global site tag (gtag.js) - Google Analytics