`

单例模式的好处?

    博客分类:
  • java
 
阅读更多

单例的好处?啥时候不能用单例?

 

 优点:单例模式保证java应用程序中,一个类Class只有一个实例在,使用单例模式好处在于可以节省内存,节约资源,对于一般频繁创建和销毁对象的可以使用单例模式。

 因为它限制了实例的个数,有利于java垃圾回收。好的单例模式也能提高性能。例如:数据库连接池、httpclient连接单例

对于系统中的某些类来说,只有一个实例很重要,Windows中就只能打开一个任务管理器,如何保证一个类只有一个实例并且这个实例易于被访问呢?定义一个全局变量可以确保对象随时都可以被访问,但不能防止我们实例化多个对象。一个更好的解决办法是让类自身负责保存它的唯一实例。这个类可以保证没有其他实例被创建,并且它可以提供一个访问该实例的方法。这就是单例模式的模式动机。

Singleton通过将构造方法限定为private避免了类在外部被实例化,在同一个虚拟机范围内,Singleton的唯一实例只能通过getInstance()方法访问。

 

缺点:有的为了节省资源创建单例模式,可能会导致共享连接池的对象程序过多,出现连接池溢出等问题。

         可能会造成一些开发混淆,因为单例模式的不能进行自己实例化。

1.单例的缺点 就是不适用于变化的对象,如果同一类型的对象总是要在不同的用例场景发生变化,单例就会引起数据的错误,不能保存彼此的状态。

2.单例模式的构造函数是静态的,所以在继承单例时,出现问题,不能被子类继承

 

第一种饿汉式:

    public class Singleton {

    private static Singleton instance = new Singleton();

    private Singleton(){};

    public static Singleton getSingletonInstance() {

        return instance;

    }

}

    优点:在类加载初始化的时候就创建对象,调用getInstance的时候,没有同步方法,运行时性能较高。

    缺点:类加载速度慢,占用太多大的资源空间。

 

第二种懒汉式:

  public class Singleton {

    private static Singleton instance = null;

    private Singleton(){};

    public static synchronized Singleton getSingletonInstance() {

        if (instance == null){

            instance = new Singleton();

        }

        return instance;

    }

}

    优点:避免了第一种方式的缺点, 同时,可以在多线程下运行安全。

    缺点:因为他使用了锁,在运行中效率慢。

 

第三种 这种实现方式可以实现既线程安全地创建实例,而又不会对性能造成太大的影响。它只是在第一次创建实例的时候同步,以后就不需要同步了,从而加快了运行速度。

双重检查加锁机制的实现会使用一个关键字volatile,它的意思是:被volatile修饰的变量的值,将不会被本地线程缓存,所有对该变量的读写都是直接操作共享内存,从而确保多个线程能正确的处理该变量。volatile只能保证可见性, 无法保证原子性.

public class Singleton {

    private static volatile Singleton instance = null;

    private Singleton(){};

 

    public static Singleton getSingletonInstance() {

        if (instance == null){

            synchronized (Singleton.class) {

                if(instance == null) {

                    instance = new Singleton();

                }

            }

        }

        return instance;

    }

}

 

第四种 内部类只有在外部类被调用才加载,产生SINGLETON实例;又不用加锁。此模式有上述两个模式的优点,屏蔽了它们的缺点,是最好的单例模式

public class Singleton {

    private Singleton(){};

    public static Singleton getSingletonInstance() {

        return Holder.SINGLETON;

    }

    private static class Holder{

        private static final Singleton SINGLETON = new Singleton();

    }

}

 

1、时间和空间  比较上面两种写法:懒汉式是典型的时间换空间,也就是每次获取实例都会进行判断,看是否需要创建实例,浪费判断的时间。当然,如果一直没有人使用的话,那就不会创建实例,则节约内存空间。  饿汉式是典型的空间换时间,当类装载的时候就会创建类实例,不管你用不用,先创建出来,然后每次调用的时候,就不需要再判断了,节省了运行时间。  

 

2、线程安全  (1)从线程安全性上讲,不加同步的懒汉式是线程不安全的,比如,有两个线程,一个是线程A,一个是线程B,它们同时调用getInstance方法,那就可能导致并发问题。如下示例:

通过图5.4的分解描述,明显地看出,当A、B线程并发的情况下,会创建出两个实例来,也就是单例的控制在并发情况下失效了。  (2)饿汉式是线程安全的,因为虚拟机保证只会装载一次,在装载类的时候是不会发生并发的。  (3)如何实现懒汉式的线程安全呢?  当然懒汉式也是可以实现线程安全的,只要加上synchronized即可

 

但是这样一来,会降低整个访问的速度,而且每次都要判断。那么有没有更好的方式来实现呢?

分享到:
评论

相关推荐

    设计模式单例模式和工厂模式综合应用

    "设计模式单例模式和工厂模式综合应用"的主题聚焦于两种常用的设计模式:单例模式和工厂模式,并探讨它们如何协同工作来实现高效、灵活的代码结构。这个主题尤其适用于Java编程语言,因为Java的面向对象特性使得设计...

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

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

    单例模式和工厂模式代码

    单例模式和工厂模式是两种常见的软件设计模式,在面向对象编程中扮演着重要的角色。它们都是为了解决特定的问题而提出的解决方案,但有着不同的应用场景和设计思路。 **单例模式** 是一种限制类实例化次数的模式,...

    设计模式——策略模式 & 单例模式

    策略模式和单例模式是软件设计中两种非常重要的设计模式,它们在实际开发中有着广泛的应用。在这篇文章中,我们将深入探讨这两种模式的核心概念、实现方式以及如何在实际项目中运用。 策略模式是一种行为设计模式,...

    php单例模式和工厂模式

    单例模式是一种设计模式,它保证了一个类只有一个实例,并提供一个全局访问点。这种模式在 PHP 中尤其适用于控制共享资源,例如数据库连接、缓存服务或者配置对象,确保在整个应用程序中这些资源只被初始化一次。 ...

    设计模式-单例模式

    **设计模式——单例模式** 单例模式是一种广泛应用于软件设计中的创建型设计模式,它的核心思想是确保一个类只有一个实例,并提供一个全局访问点。这样做的好处在于控制共享资源的访问,比如线程安全的数据库连接池...

    qt5编写的单例模式

    单例模式是软件设计模式中的一种,它的核心思想是确保一个类在整个系统中只有一个实例存在,并提供一个全局访问点。在Qt5框架中,我们可以通过特定的方式来实现这一模式,以便在多个模块之间共享数据或者控制资源。...

    工厂模式与单例模式

    在软件设计模式中,工厂模式和单例模式是两种非常基础且重要的模式,它们都是用于解决对象创建问题,但有着不同的设计理念和应用场景。本篇文章将深入探讨这两种模式,并结合具体的代码示例`myFactoryDemo`进行讲解...

    单例模式源代码

    单例模式是软件设计模式中的一种经典模式,它在Java编程中被广泛使用。这个模式的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这样做的好处包括资源管理(如数据库连接)、性能优化(如缓存服务)以及...

    PHP 单例模式解析和实战

    单例模式的核心思想是确保类只有一个实例,并提供全局访问点。这样做的好处是可以避免由于多次实例化而导致的资源浪费,同时可以集中管理全局状态,确保所有部分都操作同一份数据。 ### 实现单例模式 在 PHP 中...

    单例模式概念与实例(简单实例)

    在开发过程中,合理地使用单例模式可以带来很多好处: 1. **资源消耗降低**:由于在整个应用中只存在一个实例,因此减少了内存开销,特别是在一个对象需要大量资源时。 2. **全局访问点**:单例模式可以为整个系统...

    java单例设计模式的好处

    1. **节省内存**:由于单例模式限制了类的实例只有一个,所以在内存中只会创建一次,减少了内存的开销,特别是当实例化一个对象需要消耗大量资源时,单例模式的优势更为明显。 2. **控制资源的使用**:通过线程同步...

    简单工厂,代理模式,单例模式demo

    在众多设计模式中,“简单工厂”、“代理模式”和“单例模式”是三种常见的设计模式,它们各自有着明确的使用场景和设计目标。 首先,“简单工厂模式”是一种创建型模式,它定义了一个创建对象的接口,但让决定创建...

    经典工厂单例模式典范

    在软件设计模式的世界里,"工厂单例模式典范"是一个重要的概念,它结合了工厂模式和单例模式的优势,以解决特定的编程问题。工厂模式是一种创建型设计模式,而单例模式则是一种结构型设计模式。这两种模式的结合使得...

    单例模式示例

    单例模式是软件设计模式中的一种,用于控制类的实例化过程,确保一个类在整个程序运行期间只有一个实例存在。这种模式常被用于管理共享资源,如数据库连接、线程池或者配置文件等,以减少系统资源的浪费并提高效率。...

    Java单例模式.pdf

    Java单例模式是设计模式中的一种,在软件开发中扮演着重要的角色。单例模式的目的是保证一个类仅有一个实例,并且提供一个全局访问点。在Java中实现单例模式有多种方法,主要包括懒汉式、饿汉式、注册式(使用容器)...

    java单例模式的例子

    Java单例模式是一种常见的设计模式,它在软件工程中用于控制类的实例化过程,确保一个类只有一个实例,并提供一个全局访问点。这种模式在系统资源管理、缓存、日志记录等方面应用广泛。下面我们将深入探讨Java单例...

    Android单例模式

    懒汉式单例模式的特点是在第一次使用时才进行实例化,这种方式的好处是延迟加载,节省内存空间;缺点是如果处理不当可能会导致多线程环境下的并发问题。 ##### 实现代码示例 ```java public class Singleton { ...

    单例模式与双重检测

    单例模式是软件设计模式中的一种,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下都非常有用,比如控制数据库连接、日志记录、线程池管理等,确保了资源的有效管理和高效利用。...

    常用设计模式特点比如工厂模式、单例模式等等

    在本文中,我们将深入探讨两个主要的设计模式:工厂模式和单例模式,以及它们在实际应用中的特点。 1. 工厂模式: 工厂模式是一种对象创建型设计模式,它提供了一种创建对象的最佳方式,通过将实例化过程封装在单独...

Global site tag (gtag.js) - Google Analytics