Java单例模式

设计模式:

设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现在中都有相应的原理来与之对应,每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是它能被广泛应用的原因。简单说:

在某些场景下,针对某类问题的某种通用的解决问题的思想。

设计模式分类:

创建型模式—单例模式

一、什么是单例模式

单例模式是保证整个系统中一个类只有一个对象的实例,实现这种功能的方式就叫单例模式。

二、为什么要用单例模式

1.对于频繁使用的对象,可以省略创建对象所花费的时间,这对于那些重量级对象而言,是非常可观的一笔系统开销。(节约资源)

2.由于new操作的次数减少,所以系统内存的使用频率也会降低,这将减少GC压力,缩短GC停顿时间。

由于以上两点可知单例模式的使用对于系统的关键组件和频繁使用的对象来说是可以有效的改善系统的性能的。

三、如何实现
  1. 构造器私有:

    如果要保证一个类不能多次被实例化,那么就需要阻止对象被new 出来,所以需要把类的构造方法私有化

  2. 确保对象实例只有一个(自己创建自己)

    只对类进行一次实例化,以后都直接获取第一次实例化的对象

  3. 以静态方法返回实例。

    因为外界就不能通过new来获得对象,所以我们要通过提供类的方法来让外界获取对象实例。

上面的案例就是使用的饿汉模式。(类加载后就创建了,一直存在) ,这种模式是最简单最省心的,不足的地方是容易造成资源上的浪费。

懒汉模式( 不创建类的对象实例,等需要的时候再创建 )

以上,懒汉式如果是单线程,没有问题,但如果多线程的话,就会有安全问题。测试如下(开了4个线程,每个线程去调用懒汉式的getInstance方法,每个线程循环20次,并打印拿到对象的HASH值):

 

 

 

 

 此时就需要加同步锁:

 

 

 

面试题:一.结合多线程,实现线程安全的懒汉式(如上写法,加上同步锁)

二.单例模式的特点:

1.某个类只能有一个实例

2.它必须自行创建这个实例

3.它必须自行向整个系统提供这个实例

应用情况:对于多个对象使用同一个配置信息时,就需要保证该对象的唯一性。

三、如何保证对象的唯一性?

1.不允许其他程序用new创建该类对象。

2.在该类创建一个本类实例

3.对外提供一个方法让其他程序可以获取该对象

 

四、实现的方法:

1. 构造器私有化

2.确保对象实例只有一个(自己创建自己)。

3.以静态方法返回实例。

五、饿汉式与懒汉式的优劣式。

饿汉式优势:因为Java的类加载和初始化的机制可以保证线程安全,所以这类形式的单例设计模式不存 在线程 安全问题。 劣势:不管你暂时是否需要该实例对象,都会创建,使得不使用会造成资源浪费。

懒汉式优势:即延迟创建对象,直到用户来获取这个对象时,再创建。(不用不创建,用时再创建 )

劣势:需要考虑线程安全问题



posted @ 2020-08-07 15:38  梦想0高度  阅读(139)  评论(0编辑  收藏  举报