java设计模式--单列模式
单列模式定义:确保一个类只有一个实例,并提供一个全局访问点。
下面是几种实现单列模式的Demo,每个Demo都有自己的优缺点:
Demo1:

/**
* 单列模式需要满足下面三个条件:
* 1.私有的构造函数
* 2.私有的引用变量
* 3.公开的静态方法(唯一获取该类单个实例的地方)
*
* @author Administrator
*/
public class AmericaPresident
{
private static AmericaPresident thePresident; /**
* 功能:私有的构造函数
*/
private AmericaPresident()
{
} /**
* 功能:返回AmericaPresident对象
* @return
*/
public static AmericaPresident getPresident()
{
if(thePresident == null)
{
thePresident = new AmericaPresident();
} return thePresident;
}
} Demo1 在多线程的时候可能会出现一些程序上的bug

Demo2:

为了解决上面Demo1在多线程时候的bug,可以做出以下的修改: /**
* 单列模式需要满足下面三个条件:
* 1.私有的构造函数
* 2.私有的引用变量
* 3.公开的静态方法(唯一获取该类单个实例的地方)
*
* @author Administrator
*/
public class AmericaPresident
{
private static AmericaPresident thePresident; /**
* 功能:私有的构造函数
*/
private AmericaPresident()
{
} /**
* 功能:返回AmericaPresident对象
* @return
*/
public static synchronized AmericaPresident getPresident()
{
if(thePresident == null)
{
thePresident = new AmericaPresident();
} return thePresident;
}
} 通过增加synchronized 关键字到getPresident()方法中,我们迫使每个线程在进入这个方法之前,
要先等候别的线程离开该方法。也就是说,不会有两个线程可以同时进入这个方法。 Demo2解决了多线程下的程序bug,但是又带了一个新的问题,同步一个方法可能造成程序执行效率
下降100倍。

Demo3:

/**
* 单列模式需要满足下面三个条件:
* 1.私有的构造函数
* 2.私有的引用变量
* 3.公开的静态方法(唯一获取该类单个实例的地方)
*
* @author Administrator
*/
public class AmericaPresident
{
private static AmericaPresident thePresident = new AmericaPresident(); /**
* 功能:私有的构造函数
*/
private AmericaPresident()
{
} /**
* 功能:返回AmericaPresident对象
* @return
*/
public static synchronized AmericaPresident getPresident()
{
return thePresident;
}
} Demo3使用"急切"创建实例,而不用延迟实例化的做法,如果应用程序总是创建并使用单列实例,或者
在创建和运行方面的负担不太繁重,就可以用"急切"的方法来创建单列。
利用这个做法,我们可以依赖JVM在加载这个类时马上创建此唯一的单列实例,JVM保证在任何线程
访问thePresident静态变量之前,一定先创建此实例。

Demo4:

用"双重检验加锁",在getPresident()中减少使用同步。 利用双重检查加锁(double-checked locking),首先检查是否实例已经创建了,如果尚未
创建,"才"进行同步。这样一来,只有第一次会同步。 /**
* 单列模式需要满足下面三个条件:
* 1.私有的构造函数
* 2.私有的引用变量
* 3.公开的静态方法(唯一获取该类单个实例的地方)
*
* @author Administrator
*/
public class AmericaPresident
{
private volatile static AmericaPresident thePresident; /**
* 功能:私有的构造函数
*/
private AmericaPresident()
{
} /**
* 功能:返回AmericaPresident对象
* @return
*/
public static synchronized AmericaPresident getPresident()
{
if(thePresident == null)//检查实例,如果不存在,就进入同步区块
{
synchronized(AmericaPresident.class)//注意,只有第一次才彻底执行这里的代码
{
if(thePresident == null)//进入区块后,再检查一次,如果还是Null,才创建实例。
{
thePresident = new AmericaPresident();
}
}
}
return thePresident;
}
} volatile关键字确保:当thePresident变量被初始化成AmericaPresident实例时,多个线程正确
处理thePresident变量。 如果性能是你关注的重点,那么这个做法可以帮你大大地减少getPresident()的时间消耗。

java设计模式--单列模式的更多相关文章
- Java设计模式——组合模式
JAVA 设计模式 组合模式 用途 组合模式 (Component) 将对象组合成树形结构以表示“部分-整体”的层次结构.组合模式使得用户对单个对象和组合对象的使用具有唯一性. 组合模式是一种结构型模 ...
- 3.java设计模式-建造者模式
Java设计模式-建造者模式 在<JAVA与模式>一书中开头是这样描述建造(Builder)模式的: 建造模式是对象的创建模式.建造模式可以将一个产品的内部表象(internal repr ...
- Java设计模式-代理模式之动态代理(附源代码分析)
Java设计模式-代理模式之动态代理(附源代码分析) 动态代理概念及类图 上一篇中介绍了静态代理,动态代理跟静态代理一个最大的差别就是:动态代理是在执行时刻动态的创建出代理类及其对象. 上篇中的静态代 ...
- Java设计模式——外观模式
JAVA 设计模式 外观模式 用途 外观模式 (Facade) 为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 外观模式是一种结构型模式. 结构
- 【设计模式】Java设计模式 -工厂模式
[设计模式]Java设计模式 -工厂模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学习成长! 目 ...
- 【设计模式】Java设计模式 - 原型模式
[设计模式]Java设计模式 - 原型模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一起 ...
- 【设计模式】Java设计模式 - 桥接模式
[设计模式]Java设计模式 - 桥接模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一起 ...
- 【设计模式】Java设计模式 - 组合模式
Java设计模式 - 组合模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一起记录分享自己 ...
- 【设计模式】Java设计模式 - 外观模式
Java设计模式 - 外观模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一起记录分享自己 ...
随机推荐
- 07 设置View的显示与隐藏
在代码中: 例子: <span style="font-size:14px;">ImageButton imageButton = new ImageButton(th ...
- Swift基础之实现一个镂空图片的小Demo
前两天看了别人的文章,涉及到了镂空的展示,所以我在这里把实现的内容写成Swift语言的小Demo,供大家欣赏 首先,需要创建导航视图,然后创建两种展示方式的按钮 let vc = ViewContro ...
- 网站开发进阶(四十二)巧用clear:both
网站开发进阶(四十二)巧用clear:both 前言 我们在制作网页中用div+css或者称xhtml+css都会遇到一些很诡异的情况,明明布局正确,但是整个画面却混乱起来了,有时候在IE6下看的很正 ...
- 最简单的基于FFmpeg的视频编码器-更新版(YUV编码为HEVC(H.265))
===================================================== 最简单的基于FFmpeg的视频编码器文章列表: 最简单的基于FFMPEG的视频编码器(YUV ...
- (NO.00001)iOS游戏SpeedBoy Lite成形记(二十三)
现在还有一个视觉上的问题:玩家每次在游戏开始前选择某一赛道时,无法直观的看到所选的是哪条赛道.只能通过界面上方的gambleLabel中的文字非直观的看到.我们现在来完善它! 为了能让玩家清楚地看到, ...
- Dynamics CRM 2011/2013 DeveloperToolkit的使用
Dynamic CRM 2011的SDK中提供了一个叫DeveloperToolkit的工具,他的用途官方说明说的很明确,能方便开发者在VS中直接部署webresource.plugin.workfl ...
- Swift基础之UIImageView(都是2.2版本)
//设置全局变量,将下面的替换即可 //var myImgView = UIImageView(); //系统生成的viewDidLoad()方法 override func ...
- libevent之event_base
event_base是libevent的事务处理框架,负责事件注册.删除等,属于Reactor模式中的Reactor. event_base结构体 event_base结构体定义于<event_ ...
- 循环链表设计与API实现
基本概念 循环链表的定义:将单链表中最后一个数据元素的next指针指向第一个元素 循环链表拥有单链表的所有操作 创建链表 销毁链表 获取链表长度 清空链表 获取第pos个元素操作 插入元素到位置pos ...
- HDFS读写数据过程
一.文件的打开 1.1.客户端 HDFS打开一个文件,需要在客户端调用DistributedFileSystem.open(Path f, int bufferSize),其实现为: public F ...