【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,要说懒汉这样既说了静态,又说了线程安全问题,又说了同步岂不是很好,但是懒汉式同步加上双重判断很浪费资源 实际开发中不建议写 ,真正的项目中写饿汉式是最明智的选择!





1 0
原创粉丝点击