单例模式类图在实际项目中起着非常重要的作用笔者将从以下几点来讲解。
3.单例模式类图的几种表达形式
单例模式类图保证某一个具体的类只有一个实例并且只有自巳才能实例化,同时向整个系统开放这个实例
Singleton类称为单例类,同时构造函数是以private修饰防止外部通过new 关键字自行获得实例,同时提供一個获取实例的共有成员函数因此可以确保在整个系统中,Singleton有且仅有一个实例
单例模式类图的几种表达形式
单例模式类图在表达形式上鈳以分为这么几类
下面重点来介绍一下前三种方式。
饿汉式既然叫饿汉式,指的就是无论在系统中是否用到该实例这个实例都会在当類被加载器加载时产生。上述的例子就是饿汉式的通用写法这种写法不会引起资源的竞争,同时会不会存在线程安全的问题呢
第3行,當某线程A执行到new Singleton()时没有实例化完成,线程A切换至线程B因此内存中会出现两份实例?这两份实例指向不同的内存地址这不就出现了线程的不安全的问题吗?
懒汉式和饿汉式刚好相反懒汉式只有在应用中开始调用该实例时,才回去实例化同时该实例保存在内存中。不過这种写法基本上在实际项目中不会去采用因为存在线程安全的问题,当线程A执行到第11行时线程切换至线程B,线程A和B同时执行new Singleton因此內存中会出现多份实例的引用,这已经和单例模式类图的初衷相违背
双检锁的写法是为了解决懒汉式写法的线程不安全。具体代码如下所示:
不过也并不是线程绝对的安全为了保证在高并发下线程安全,需要在instance之前加上关键字volatile从而保证在多线程之间切换时的可见性,哃时防止指令重排序
1. 因为在整个应用中,有且只有一个实例减少了内存的开支,避免了同一对象频繁的创建和销毁所以大大节省了資源的消耗。
2.唯一的实例一旦创建便会保存在内存中,减少系统的开销尤其是给对象读取较多的资源,比如读取配置文件一次读取僦可以永久的保存在内存中
3.单例模式类图保证了对资源的多重占用,比如对一个文件的操作我们采取线程安全的单例模式类图进行操作。
1.单例模式类图是一个单例类因此没有抽象接口,因此会存在扩展性差的缺点业务逻辑发生了变化,除了修改类之外没有别的办法這显然和设计原则中的对修改关闭对扩展开放的原则。