【Java基础】单利设计模式
来源:互联网 发布:java字符串替换某一位 编辑:程序博客网 时间:2024/05/16 16:56
【声明】我不会一步一步带您剖析原理(大牛很多如果深入讲解也轮不到我 (*^__^*) 嘻嘻……),只会总结可用好用的与您分享
1 -- 对于单利模式的来源已经很模糊了 就记得是四个臭不要脸的外国人凑到一起弄出来Java的23种设计模式 我们项目中最常用的可能就是单利设计模式,单利设计模式保证对象在内存中的唯一
2 -- 条件 单利模式有三个条件
|-- 2.1构造函数私有化 不对外提供创建对象的方法
|-- 2.2在本类中new出本类静态对象
|-- 2.3对外提供一个可调用的静态方法 返回本类对象
3 -- 饿汉式 这个在项目中最常用,项目中不建议使用懒汉式 懒汉式只有在面试的时候会问到
/** * @描述 单利设计模式 * * 饿汉式 * */class Single {//在本类中new出本类静态对象private static final Single s = new Single();//构造函数私有化 不对外提供创建对象的方法private Single() {}//对外提供一个可调用的静态方法 返回本类对象public static Single getInstance() {return s;}}4 -- 懒汉式
懒汉式比较复杂一些 有些会用同步函数上,有些用同步方法上,我直接上一种可行的方案 (这个方案基本就是懒汉式的标准)
/** * @描述 懒汉式 */class SingleDemo {private static SingleDemo singleDemo = null;private SingleDemo() {}public static SingleDemo getInstance() {if (singleDemo == null) {synchronized (SingleDemo.class) {if (singleDemo == null) {singleDemo = new SingleDemo();}}}return singleDemo;}}|-- 4.1首先创建本类的静态对象 初始值赋为null
|-- 4.2构造函数私有化 禁止外部创建本类对象
|-- 4.3提供一个静态方法 返回本类对象
|--> 4.3.1当多线程并发访问的时候此处可能会出现问题 不能保证对象的唯一 上面写的懒汉式已解决此问题
|--> 4.3.2 要加 synchronized关键字来进行同步
5 -- 解释懒汉式
|-- 5.1多线程,当A和B 同时进入函数时,读到 if (singleDemo == null) 首先A获取了cpu的执行权一判断为null 冲进去了
|-- 5.2当A进入同步锁后 突然困了就挂那了,B获得了cpu的执行权 一路高歌猛进冲进去了 一读到同步里面有人就在外面等着,
|-- 5.3这时候A醒了,一路冲到底 创建完对象出来了,这时候B又获取了cpu的执行权 冲破同步锁一判断发现对象已经不为null了所以没有办法继续创建对象,这样就保证了对象在内存中的唯一性,也保证了多线程情况下不会出现重复创建对象的情况
总结:懒汉模式只有在面试的时候用,面试官问你单利的时候千万别说饿汉式,容易被直接pass,要说懒汉这样既说了静态,又说了线程安全问题,又说了同步岂不是很好,但是懒汉式同步加上双重判断很浪费资源 实际开发中不建议写 ,真正的项目中写饿汉式是最明智的选择!
- 【Java基础】单利设计模式
- java设计模式--单利
- java设计模式,单利模式
- java设计模式之单利模式
- JAVA设计模式之单利模式
- Java设计模式(三):单利模式
- JAVA设计模式之单利模式
- JAVA单利设计模式中的延迟加载
- 设计模式--单利模式
- 设计模式-单利模式
- 黑马程序员——java基础——单利设计模式
- 单利设计模式
- 单利设计模式
- 单利设计模式
- 设计模式-单利
- java单利模式
- java中单利模式
- java单利模式
- java数据结构和算法(ListToArrayUtil)
- 第7周项目4-队列数组
- windows下缩短time_wait的时间
- Android本地及网络音乐播放器-网络音乐的试听和下载(四)
- 第七周-栈和队列(二)项目一-建立顺序环形队列算法库
- 【Java基础】单利设计模式
- 第七周项目4-队列数组
- linux入门经验之谈
- 雪花飘落设计
- 模式三:装饰者模式(Decorator Pattern)——对象的功能扩展
- windows下caffe训练mnist
- java数据结构和算法(SelectionSort)
- jsp中输出时间的四种方法
- 控制下载SDK