`

单例模式的好处?

    博客分类:
  • 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一共有23种设计模式,单例模式就是指一个类只有一个实例,且该类能...项目中一般可以通过单例模式来获取同一个对象来调用工具方法,这样的好处是节约内存资源,我没有必要创建多个不同的对象,因为这样消耗内存资源

    Singleton(单例模式)

    在Java应用中,单例对象能保证在一个...3、有些像交易所的核心交易引擎,控制着交易流程,如果该类可以创建多个的话,系统完全乱了,只有使用单例模式,才能保证核心交易服务器独立控制整个流程。 CSDN代码的详细解释。

    java单例设计模式的好处

    文章详细描述了什么是单例设计模式以及单例设计模式的的好处和应用。

    美团Java 岗 154 道面试题.zip

    请用 Java 写出线程安全的单例模式 100.在 Java 中,什么叫观察者设计模式(observer design pattern)? 101.使用工厂模式最主要的好处是什么?在哪里使用? 102.举一个用 Java 实现的装饰模式(decorator design ...

    PHP实现单例模式建立数据库连接的方法分析

    本文实例讲述了PHP实现单例模式建立数据库连接的方法。分享给大家供大家参考,具体如下: 理解php单例模式 ...三、单例模式的好处 1:减少频繁创建,节省了cpu。 2:静态对象公用,节省了内存。 3:功

    PHP设计模式之单例模式原理与实现方法分析

    本文实例讲述了PHP设计模式之单例模式原理与实现方法。分享给大家供大家参考,具体如下: 一、什么是单例模式 ...使用单例模式的好处很大,以数据库操作为例。若不采用单例模式,当程序中出现大量数据库操作时

    学习JavaScript设计模式(单例模式)

    单例模式的定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。 单例模式是一种常用的模式,有一些对象我们往往只需要一个,比如线程池、全局缓存、浏览器的window对象。在js开发中,单例模式的用途同样...

    QWidget和QML交互,通过元对象函数和单例模式及信号中转类

    重点:通过注册Widget单例类和SignalManager信号中转类,实现交互,这种方法的好处在于讲QML文件作为资源加载到QWidget中,并且在QML中使用Connections自动连接信号,方便管理,运用对象和单例模式思想

    浅谈C#单例模式的实现和性能对比

    单例指的是只能存在一个实例的类(在C#中,更准确的说法是在每个AppDomain之中只能存在一个实例的类,它是软件工程中使用最多的几种模式之一。在第一个使用者创建了这个类的实例之后,其后需要使用这个类的就只能...

    1.什么是设计模式? 2.设计模式是指在软件开发中,经过验证的,用于解决在特定环境下、重复出现的、特定问题的解决方案 3.说出

    4.简单工厂,外观模式,适配器模式,单例模式,工厂方法模式,抽象工厂模式,生成器模式,原型模式,中介者模式,代理模式,观察者模式,命令模式,迭代器模式,组合模式,模板方法模式,策略模式,状态模式,备忘录...

    深入理解Java中没那么简单的单例模式

    主要给大家详细介绍了Java单例模式,关于Java中的单例模式并非看起来那么简单的,为什么要这么说呢?下面通过这篇文章来一起看看吧,有需要的朋友们可以参考借鉴。

    设计模式课程设计---使用6个不同的设计模式完成绘图系统(java)

    运用到的设计模式有备忘录模式,迭代器模式,简单工厂模式,状态模式,模版方法模式,单例模式。 资源包含项目文件(eclipse)以及系统说明(docx文件),系统说明中说明了为什么要使用该模式,使用该模式有什么好处...

    javascript 单例模式演示代码 javascript面向对象编程

    单例模式的好处就是:类只实例化一次,省资源,节省开销,提高速度,学习js面向对象编程的朋友可以参考下。

    mfc单态模式的例子

    在C#、Java里面常用单态模式,单态模式的好处就不必说了,可提高代码的运行效率....按现有网站上搜索资料写单态模式时,调试总是提示失败,因此自己动手写一个例子供广大mfc入门学习者参考。

    php单例模式实现(对象只被创建一次)

    是我在php面试题中遇到的一道试题,单例模式按字面来看就是某一个类只有一个实例,这样做的好处还是很大的,比如说数据库的连接,我们只需要实例化一次,不需要每次都去new了,这样极大的降低了资源的耗费

    Java 设计模式详解超详细(含示例代码)

    创建型模式涉及对象的创建,包括单例模式、工厂模式、原型模式等;结构型模式关注对象之间的结构关系,包括适配器模式、桥接模式、组合模式等;行为型模式则关注对象的交互和职责分配,包括观察者模式、策略模式、...

    C_C++问题总结

    3.5.1 如何实现单例模式 3.5.2 如何实现单例模式 3.6 返回“引用”的格式、好处、注意事项 3.7 指针的表示 3.8 拷贝构造函数的调用时机 3.9 如何确保对象在抛出异常时也能被删除?什么是RAII? 3.10 仿函数的实现 ...

    PHP中单例模式的使用场景与使用方法讲解

    单例模式按字面来看就是指某一个类只存在一个实例,这一点其实是与静态方法是相同的,只存在一个实例的好处是当我们需要使用某个类时只需要实例化一次,不需要每次都去new,极大的降低了资源的耗费,比如说数据库的...

    Java求职面试宝典各大公司常考知识点

    如何控制两种框架中的单例模式? 9 4.7. struts如何实现国际化 9 4.8. struts2.0的常用标签有哪些 10 4.9. struts中怎么配置form-bean、action、tiles 10 4.10. logic标签有哪几个? 12 4.11. action是单实例还是多...

    Spring面试专题.pdf

    2、使用 Spring 框架能带来哪些好处? 3、什么是控制反转(IOC)?什么是依赖注入? 4、请解释下 Spring 框架中的 IoC? 5、BeanFactory 和 ApplicationContext 有什么区别? 6、Spring 有几种配置方式? 7、如何用...

Global site tag (gtag.js) - Google Analytics