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一起记录分享自己 ...
随机推荐
- malloc、calloc、relloc
1.malloc void * malloc(size_t _Size); malloc函数在堆中分配参数_Size指定大小的内存,单位:字节,函数返回void *指针. 2.calloc void ...
- (一〇一)集成静态库RHAddressBook实现OC访问通讯录
使用官方的AddressBook框架仅能使用C语言访问通讯录,十分不便,这里介绍集成第三方框架RHAddressBook的方法,该框架可以通过OC访问和操作通讯录. 该框架是一个静态库,集成比较复杂. ...
- MySql下视图的创建
(1).第一类:create view v as select * from table; (2).第二类:create view v as select id,name,age from ta ...
- cocos2d-js(一)引擎的工作原理和文件的调用顺序
Cocos2d-js可以实现在网页上运行高性能的2D游戏,实现原理是通过HTML5的canvas标签,该引擎采用Javascript编写,并且有自己的一些语法,因为没有成熟的IDE,一般建立工程是通过 ...
- DB 查询分析器 6.04 在 Windows 10 上的安装与运行展示
DB查询分析器 6.04 在 Windows 10 上的安装与运行展示 中国本土程序员马根峰(CSDN专访马根峰:海量数据处理与分析大师的中国本土程序员 http://www.csdn.net/art ...
- Java函数2:计算两个日期相差的天数
import java.util.Scanner; public class HelloWorld { public static void main(String[] args){ // Scann ...
- 分布式系统中的RPC请求经常出现乱序的情况 写一个算法来将一个乱序的序列保序输出
分布式系统中的RPC请求经常出现乱序的情况. 写一个算法来将一个乱序的序列保序输出.例如,假设起始序号是1,对于(1, 2, 5, 8, 10, 4, 3, 6, 9, 7)这个序列,输出是: 1 ...
- ad network 和 ad exchange 的对比
著名的SSP技术提供商PubMatic联合四家知名的DSP公司跟踪实时竞价系统的效果,给出的结果是惊人的749%广告效果提升和64%的媒体收入的增加.2007年发生的一系列在广告交易领域的创投,以及一 ...
- Iterm2安装Zsh + Oh My Zsh+Solarized
安装Oh My Zsh curl -L https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh | sh 安装Zsh ...
- python标准库:collections和heapq模块
http://blog.csdn.net/pipisorry/article/details/46947833 python额外的数据类型.collections模块和heapq模块的主要内容. 集合 ...