[zt]Singleton和Double-Checked Locking设计模式—UML图及代码实现
Singleton和Double-Checked Locking设计模式,分别指的是单例模式和双重检查锁模式,它们都可以用于确保某个类只有一个对象实例化。
两个模式的区别在于:Singleton模式用在单线程应用程序中,而Double-Checked Locking模式用于多线程模式。
一、Singleton模式
UML图:
代码:
- package bupt.xujinliang.singletonpattern;
- /**
- *
- * @author jin
- *
- */
- public class SingletonExample {
- public static void main(String[] args) {
- Printer printer1 = Printer.getInstance();
- Printer printer2 = Printer.getInstance();
- if(printer1 == printer2) {
- System.out.println("printer2 point to the same address with printer1");
- } else {
- System.out.println("printer2 point to different address with printer1");
- }
- }
- }
- class Printer {
- private static Printer instance;
- public Printer() {
- System.out.println("Printer Constructor");
- }
- public static Printer getInstance() {
- if(null == instance)
- instance = new Printer();
- return instance;
- }
- }
运行结果:
2.Double-Checked Locking模式
- Printer* get_instance(void)
- {
- lock();
- if( instance == 0) {
- instance = new Printer;
- }
- unlock();
- return instance;
- }
上述代码存在的问题是:无论是否已经初始化都要加锁,增加了负荷,已经没有所谓的并发性能了。
- Printer* get_instance(void)
- {
- if( instance == 0){
- lock();
- instance = new Printer;
- unlock();
- }
- return instance;
- }
上述代码存在的问题是:不能保证临界区只初始化一次,没能实现singleton的基本功能。
- Printer* get_instance(void)
- {
- if( instance == 0){
- lock();
- if( instance == 0 )
- instance = new Printer;
- unlock();
- }
- return instance;
- }
这是比较完善的Double-Checked Locking模式实现的代码。
- class Printer {
- private static Printer resource ;
- public static Printer getInstance(){
- if(resource == null ){
- synchronized (DoubleCheckedLockingExample.class) {
- if(resource == null ){
- resource = new Printer() ;
- }
- }
- }
- return resource ;
- }
- private Printer(){}
- }
上面程序真正的问题是没有同步的情况下读取共享变量resource,并发的情况下对象的状态值有可能是过期无效的。要解决这个问题也很简单,把resource声明为volatile类型。volatile有什么作用?引用《java并发编程实战》的解析:
- 当一个域声明为volatile类型后,编译器与运行时会监视这个变量:它是共享的,而且对它的操作不会与其他的内存操作一起被重排序。volatile变量不会缓存在寄存器或缓存在对其他处理器隐藏的地方。所以,读一个volatile类型的变量时,总会返回由某一线程所写入的最新值。
读取volatile变量比读取非volatile变量的性能几乎没有差别,不过需要注意的是volatile只能保证内存可见性,并不能保证原子性。
- class Printer {
- private static class Instance {
- static final Printer instance = new Printer();
- }
- private static Printer resource ;
- public static Printer getInstance(){
- return Instance.instance;
- }
- private Printer(){}
- }
上述方法之所以有效,是因为内部类(Instance)将只被装载一次,所以只会创建一个对象。
[zt]Singleton和Double-Checked Locking设计模式—UML图及代码实现的更多相关文章
- Java中的双重检查锁(double checked locking)
最初的代码 在最近的项目中,写出了这样的一段代码 private static SomeClass instance; public SomeClass getInstance() { if (nul ...
- Double Checked Locking 模式
转自:http://blog.csdn.net/wwsoon/article/details/1485886 之前在使用Double Check Locking 模式时,发现自己还是不太理解.于是写个 ...
- 设计模式-UML图简单介绍
直接上法宝: 1.类(Class) 类图分三层: 第一层显示类的名称,如果是抽象类,则就用斜体显示. 第二层是类的特性,通常就是字段和属性. 第三层是类的操作,通常是方 ...
- 设计模式UML图
1.简单工厂模式 2.工厂模式 工厂模式与简单工厂模式的不同在于,每个操作类都有自己的工厂,而且把逻辑判断交给了客户端,而简单工厂的逻辑判断在工厂类里边,当增加新的操作类时,简单工厂需要修改工厂类,而 ...
- 【转】23种设计模式UML图
原文:http://blog.csdn.net/bwwlpnn/article/details/7421628
- 三类设计模式UML图
http://design-patterns.readthedocs.org/zh_CN/latest/index.html
- 23种设计模式UML图
- 设计模式 UML & java code
A: 创造性模式 1. 工厂方法模式(FactoryMethod) 1.1 类图 1.2 代码1 public interface Pet { public String petSound(); } ...
- 23种经典设计模式UML类图汇总
在这里23种经典设计模式UML类图汇总 创建型模式 1.FACTORY—追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基 ...
随机推荐
- 无法定位程序输入点 _glutCreateWindowWithExit于动态链接库glut32.dll上
程序运行提示错误"无法定位程序输入点 _glutCreateWindowWithExit于动态链接库glut32.dll上",网上查了说是opengl的.lib和.dll版本过低, ...
- C++重载覆盖隐藏
写一个程序,各写出重载覆盖 1 // // main.cpp // 2013-7-17作业2 // // Created by 丁小未 on 13-7-17. // Copyright (c) 201 ...
- jBox使用记录
1.不显示底部按钮,可以将buttons设置为buttons:{} 例:$.jBox.open("iframe:http://www.baidu.com", "百度一下& ...
- sublime text 2中Emmet8个常用的技巧
原文链接:http://blog.csdn.net/lmmilove/article/details/9181323 因为开始做web项目,所以最近在用sublime编辑器,知道了一个传说中的emme ...
- window系统查看端口被哪个进程占用了
C:\netstat -aon|findstr 8080TCP 127.0.0.1:80 0.0.0.0:0 LISTENING 2448端口被进程号为2448的进程占用,继续执行下面命令:C:\ta ...
- [HTTP那些事]网络请求API
在Android上,原生API有两个,HttpUrlConnection和HttpClient,它们对封装Socket进行封装,让HTTP请求变得简单.这应该也算框架吧? 想象下,如果没有HttpUr ...
- SpringJMS解析2-JmsTemplate
尽管消息接收可以使用消息监听器的方式替代模版方法,但是在发送的时候是无法替代的,在Spring中必须要使用JmsTemplate提供的方法来进行发送操作,可见JmsTemplate类的重要性,那么我们 ...
- JavaScript 之 iframe自适应问题---可以用来实现网页局部刷新
1.HTML <iframe src="index.html" id="iframepage" frameborder="0" scr ...
- 读取接口XML和批量导入数据SqlBulkCopy
首先是C#处理xml文档 string urlStr = string.Format("http://……?timeBeg={0}&timeEnd={1}", timeBe ...
- NSDictionary、NSMutableDictionary及其枚举器的用法
.不可变词典NSDictionary 字典初始化 NSNumber *numObj = [NSNumber numberWithInt:]; 以一个元素初始化 NSDictionary *dic = ...