设计模式 单例

五分钟学设计模式.01.单例模式

基于上方的视频的学习笔记


Ensure a class has only one instance,and provide a global point of access to it.

 

1.定义

简单来说 就是一个类的构造函数必须是私有的(private

然后这个类提供一个公开的静态方法 public static 在方法里调用类的构造函数实例化对象

最后这个类存在一个类变量(静态变量 static修饰)

 

主要作用:确保一个类只有一个实例存在

 

常见场景:序列号生成器、web页面的计数器、某些消耗许多资源的场景(访问IO或者数据库的资源)

 

2.细分

饿汉式、懒汉式

 

2.1 饿汉式

这个唯一的实例,在类进行加载时立刻进行实例化

class SingletorÅ 
private static Singleton ngletoö 
new Singleton() ; 
private 
public static Singleton 
return sivLeton;

 

2.2 懒汉式

这个唯一的实例,在类加载的时候不进行实例化,在第一次使用时再进行实例化

①由于被使用时才实例化,所以还得加上锁,防止并发运行时被重复执行

②由于不是类加载时就执行,所以会在程序运行过程中被反复执行,必须加if判断

class Singleton{ 
private static Singleton singleton; 
private 
public synchronized static Singleton 
if(singLeton 
null) 
singleton = new 
return singleton;

 

2.3 懒汉式 - 双重检查锁

可以发现上面的懒汉式会在程序运行过程中被反复执行,但是我们知道一旦类被实例化,if判断就肯定不为空,而自动锁会导致每个线程运行这个方法时都要排队,导致整体效率低下。

而锁是不能丢的,所以锁要缩小范围,只锁住实例化对象的代码,外部的if判断不锁。

 

①将自动锁范围缩小到if语句内,只锁住实例化对象的代码

②使用双重检查锁进行初始化的实例必须使用Volatile关键字修饰

class Singleton 
private volatile static Singleton singleton; 
private 
public static Singleton getlnstance(){ 
if(sjngleton 
null) 
synchronized (Singleton. 
return 
if(singleton null) 
singleton = new 'ingletp/(); 
singleton;

 

Volatile修饰的原因:

0 主 . @ 0 加 volatile 处 许 , singleton 
1 、 分 配 门 亻 吓 
2 、 始 化 对 象@ 
师 向 刚 分 的 址 , 若 生 过 0 序 , 
new Singleton() 可 以 扒 内 叾 步 
没 A 线 杵 i 亍 了 1 和 引 还 泠 执 02 . 8 线 耒 到 剂 新 NULL. 8 线 捍 会 0 返 到 还 门 怡 化 的 i 冂 5 a 冂 c 巳 了 。 volatile 可 以 中 00 彳 。 
( 使 用 双 重 检 查 锁 进 行 初 始 化 的 实 例 须 使 用 vo | ati 《 e 关 字 修 饰 )

 

3.单例模式的缺点

只有一个实例化对象,会随时被修改,所以为了避免这种风险,单例模式创建的对象一般要求是无状态的——即通常是工具类

posted @ 2021-09-02 21:49  夏·舍  阅读(39)  评论(0编辑  收藏  举报