单例模式:控制实例创建数目

简介: 单例模式的本质是在于控制实例创建数目

场景分析

多个客户端通过new 多个配置对象的实例来获取配置内容,而配置对象的获取的内容都是一样的,只需要一个实例即可。多个配置对象严重浪费系统内部资源。

image.png
定义及本质

定义:保证一个类只有一个实例,并提供一个访问它的全局访部点。
本质:控制实例创建数目。
功能:保证类在运行期间只会被创建一个类的实例。
范围:一个虚拟机的范围,如果一台机器有多个虚拟机,每个虚拟机都会有一个类的实例,这个类就是多例;
命名:getInstance()
结构示意图:

image.png

解决方案
1 懒汉式
一个私有化构造器、一个静态方法、一个静态属性
延迟加载思想:一开始不需要加载资源或数据,等使用的时候再加载,节约资源。
缓存思想:当某资源或数据频繁被使用,将其缓存到内存中,节省时间,典型的以空间换时间的方案。
2 饿汉式:利用static特性
static 变量在类装载的时候进行初始化;
多个实例的static 变量会共享同一块内存区域;
3 静态内部类实现单例,延迟加载(类级内部类)
Lazy initialization holder class模式,这个模式综合使用了Java的类级内部类和多线程缺省同步锁的知识,很巧妙的同时实现了延迟加载和线程安全。
类级内部类可以让类装载时不去初始化对象,只要不使用到这个类级内部类,就不会创建对象实例。

(1)Java的类级内部类
什么是类级内部类?

类级内部类指的是:有static修饰的成员式内部类。如果没有static修饰的成员式内部类被称为对象级内部类。

类级内部类相当于其外部类的static成分,它的对象与外部类对象间不存在依赖关系,因此可直接创建。而对象级内部类的实例,是绑定在外部对象实例中的。
类级内部类中,可以定义静态的方法,在静态方法中只能够引用外部类中的静态成员方法或者成员变量。
类级内部类相当于其外部类的成员,只有在第一次被使用的时候才会被装载
(2)多线程缺省同步锁
为了解决并发问题,主要是通过使用synchronized来加互斥锁进行同步控制。但是在某些情况中,JVM已经隐含地执行了同步,这些情况下就不用自己再来进行同步控制了。
由静态初始化器(在静态字段上或 static{} 块中的初始化器)初始化数据时;
访问 final 字段时;
在创建线程之前创建对象时;
线程可以看见它将要处理的对象时;

枚举类实现单例
(1)枚举类型的基本思想
通过公有的静态final域为每个枚举常量导出实例的类。枚举是单例的泛型化,本质上是单元素的枚举。
(2)枚举实现单例的好处
自由序列化(枚举本身已实现Serializable接口);
线程安全(通过静态final域实现,JVM初始化时线程安全);
简洁易用;

UML类图
image.png

调用时序图
image.png

优缺点
(1)时间和空间
懒汉式是典型的时间换空间:每次获取实例时先要判断是否需创建实例。
饿汉式是典型的空间换时间:类装载时就会创建类实例;
(2)线程安全
懒汉式是非线程安全的,饿汉式是线程安全的(类装载时没有并发);
懒汉式安全实现机制:
第一种:加上synchronized,每次进入getInstance方法都需要同步,降低了访问速度;
第二种:双重检查加锁

相关文章
|
2月前
|
前端开发 算法 JavaScript
检查是否是类的对象实例
检查是否是类的对象实例
16 0
|
4月前
|
缓存 Java
线程的四种创建方式
线程的四种创建方式
|
10月前
|
设计模式 缓存 安全
Java代理模式:如何优雅地控制对象访问?
Java代理模式:如何优雅地控制对象访问?
151 1
|
11月前
|
C++
线程的2种创建方式
当一个类继承了Thread类,该类就可以当作线程使用。 run方法其实是一个普通方法,是Runnable接口的一个方法。 Thread类也是进行了重写。 真正实现多线程的start方法中的start0方法。 这是一个本地native方法,由c/c++实现。
61 0
|
Java 程序员 调度
线程的创建方式,状态周期管理
进程是计算机中的程序,关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。
105 0
线程的创建方式,状态周期管理
|
NoSQL Java 调度
线程的三种创建方式你get了吗?
线程的三种创建方式你get了吗?
113 0
线程的三种创建方式你get了吗?
|
设计模式 安全 Java
Java设计模式——单例模式——全局唯一 节省资源
本文目录 1. 场景 2. 简单实现 3. 简单实现的bug 4. 多线程环境保持单例 5. 效率不咋地 6. 提高多线程下效率
175 0
|
运维
实例维护属性-让您的实例更可控
阿里云给实例加入了维护属性这个属性,通过对该属性的修改,您可以自主选择实例出现非预期宕机或者主动运维事件之后的状态,为您的操作提供更高的透明度和便捷度
2346 0
实例维护属性-让您的实例更可控
|
Web App开发 Linux
【优化】创建安全组时支持同步创建规则
经常听到用户反馈:为什么我的实例SSH不通?为什么部署在ECS实例上的网站无法访问?这类问题多数是由于没有正确配置ECS实例所属安全组的规则。这种情况的场景一般是用户在创建安全组后,忘记了创建规则导致无法访问实例,进而实例无法提供服务。
1417 0