设计模式 :单例模式(Singleton Pattern)

设计模式-单例模式(Singleton Pattern)解析

 

1. 单例模式(Singleton Pattern)的定义:

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

 

2. 单例模式(Singleton Pattern)的用处:

     有一些对象其实我们只需要一个,例如:线程池(thread pool),缓存(cache),对话框,处理偏好设置和注册表(registry)的对象,日志对象等设备的驱动程序的对象。事实上,这类对象只能有一个实例,如果创建多个实例,就会导致许多问题的产生,比如:程序的行为异常,资源使用过量,或者是不一致的结果。

 

3.单例模式(Singleton Pattern的类图:

 

 4.单例模式的实现方式(5种):

(1) 懒汉模式- -(线程不安全)。

      经典模式声明了一个静态对象,在用户第一次调用时初始化。这虽然节约了资源,但第一次加载时需要实例化,反应稍慢一些,而且在多线程情况下不能正常工作。

 

(2)懒汉模式--(线程安全)。

      把getInstance( )方法变成同步(synchronized)方法,多线程带来的线程不安全的问题就可以既轻松又有效地解决掉,但是随之带来的是拖垮性能,需知道,同步一个方法可能造成程序执行效率下降100倍。但是,如果应用程序可以接受getInstance()造成的额外负担,便可以考虑该做法。如果是将getInstance( )的程序使用在频繁运行的地方,则可能需要重新考虑了。

 

(3)饿汉模式--(线程安全)。

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

 

(4)双重检查模式--(线程安全)。

     这种写法在 getSingleton ( ) 方法中对 Singleton 进行了两次判空:第一次是为了不必要的同步;第二次是在 Singleton==null 的情况下才创建实例。在这里使用了 volatile 会或多或少地影响性能,但考虑到程序的正确性,牺牲这点性能还是值得的。这种写法的优点是资源利用率高。第一次执行 getInstance ( ) 时,单例对象才被实例化,效率确实是高。但其缺点是第一次加载时反应稍慢一些,在高并发环境下也有一定的缺陷。双重检查模式虽然在一定程度上解决了资源的消耗和多余的同步、线程安全等问题,但其还是在某些情况会出现失效的问题。

 注意! (双重检查模式不适用于1.4及更早版本的Java)。

 

(5)静态内部类单例模式

这种写法第一次加载 Singleton 类时不会初始化 sInstance ,只有第一次调用 getSingleton ( ) 方法时模拟机加载 SingletonHolder 并初始化 sInstance 。这样不仅能确保线程安全,也能保证 Singleton 类的唯一性。所以,比较推荐使用静态内部类单例模式这种写法。

 

 5.单例模式的使用场景

在一个系统中,要求一个类有且仅有一个对象,它的具体使用场景如下:

  • 整个项目需要一个共享访问点或共享数据。
  • 创建一个对象需要耗费的资源过多,比如访问 I / O 或者数据库资源。
  • 工具类对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值