设计模式:学习笔记(1)——单例模式
来源:互联网 发布:数据库数据太多 编辑:程序博客网 时间:2024/05/22 06:51
Java设计模式之单例模式
引入单例模式
什么是单例模式
对于某些类来说,我们只想其拥有一个实例,并且我们仅仅使用这一个实例:比如说线程池,缓存,对话框,处理偏好设置和注册表的对象、日志对象、显卡等设备的驱动程序的对象。这些类对象只能有一个,如果制造出多个实例,就会导致许多问题的产生。例如:程序的行为异常,资源使用过量或者冲突等等。
单例模式正是可以满足我们需求的设计原则:确保一个类只有一个实例,并提供一个全局访问点。
单例模式的经典实现
实现
理解
☐ 首先,我们利用静态变量来记录Singleton类的唯一实例。
☐ 其次,我们将构造器声明为私有的,只有在Singleton类内才可以调用构造器。
☐ 我们只有通过getInstrance()来访问实例化对象,并返回这个静态实例。
☐ 我们保证了该类有且只有唯一静态实例,并以此为该类唯一入口,提供内部方法的访问,任何使用该类的地方都只能共享此实例。
处理多线程
多线程带来的问题
如果多个线程同时首次执行getInstance()方法,也就是在静态实例还未被初始化时,多个线程同时满足条件了uniqueInstance==null,这样它们便会各自new出自己的实例,并且返回。这样该类就有了多个实例,(时序图如下)这就不满足我们的设计原则了,所以我们将介绍几种方法来解决多线程带来的问题。
使用同步锁
说明:
使用同步锁,保证每次只有一个线程进入该方法体内。但是,我们只有在第一次执行此方法时才需要同步,换句话说,一旦设置好uniqueInstance变量,就不需要同步这个方法了。所以此后同步变为累赘。
使用“急切”创建实例
说明:
这可能时最简单高效的解决同步问题的方法了,但是延迟加载可以确保在用到的时候才创建对象。急切则不然。
使用双重锁检查锁
说明:
☐ volatile关键字确保,当uniqueInstance变量被初始化成实例后,多个线程可以正确的处理uniqueInstance变量。
☐ 这个做法可以大大的减少getInstance()带来的时间耗费。因为只有在第一次访问getInstance()方法时才执行同步。
- 设计模式:学习笔记(1)——单例模式
- 设计模式:学习笔记(1)——单例模式
- 设计模式:学习笔记(1)——单例模式
- 设计模式——单例模式(学习笔记)
- 设计模式学习笔记——单例模式
- 设计模式学习笔记——单例模式
- 设计模式学习笔记——单例模式
- 设计模式学习笔记——单例模式
- 设计模式学习笔记——单例(Singleton)模式
- 设计模式学习笔记——单例模式
- 十七、单例模式——设计模式学习笔记
- 设计模式学习笔记—单例模式
- 设计模式学习笔记—单例模式(Singleton)
- 设计模式学习笔记:单例模式
- 设计模式学习笔记-单例模式
- 设计模式学习笔记--单例模式
- 设计模式学习笔记-单例模式
- 设计模式学习笔记-单例模式
- dubbo出错笔记(二)
- poj 1037 A decorative fence(dp,好题)
- Linux基本命令 ubuntu
- Linux下的定时任务Crontab
- python数据类型
- 设计模式:学习笔记(1)——单例模式
- ubuntu mtd-utils
- 一步一步制作yaffs/yaffs2根文件系统(一)---储备好基础知识再打
- RabbitMQ之RPC实现
- AngularJs过滤器
- IE 6 7 8支持HTML 兼容
- 算法训练 结点选择 蓝桥杯
- 409. Longest Palindrome | 判断能组成的最长回文
- 求一个连续子序列的和的最大值