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模式
Double Check Locking模式是singleton的多线程版本,必须使用锁来锁定临界区,当多个线程存在访问临界区的意图时,保证了临界区只被访问一次。
首先介绍其在C/C++环境下的实现过程:
代码1:
Printer* get_instance(void) { lock(); if( instance == 0) { instance = new Printer; } unlock(); return instance; }上述代码存在的问题是:无论是否已经初始化都要加锁,增加了负荷,已经没有所谓的并发性能了。
代码2:
Printer* get_instance(void) { if( instance == 0){ lock(); instance = new Printer; unlock(); } return instance; }上述代码存在的问题是:不能保证临界区只初始化一次,没能实现singleton的基本功能。
代码3:
Printer* get_instance(void) { if( instance == 0){ lock(); if( instance == 0 ) instance = new Printer; unlock(); } return instance; }这是比较完善的Double-Checked Locking模式实现的代码。
为什么叫做Double-Checked Locking呢?请看上述代码3,可以看到在加锁前后都对instance变量进行了检查,故谓之Double-Checked Locking。
那么在Java中的实现与在C/C++中不同吗?是的。
下面的的Java代码是不能够实现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变量的性能几乎没有差别,不过需要注意的是volatile只能保证内存可见性,并不能保证原子性。
现给出Java在多线程下实现单个实例化对象的方法:
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)将只被装载一次,所以只会创建一个对象。
相关推荐
各种工厂模式 242 第21章 Singleton模式和Double-Checked Locking模式 249 第22章 Object Pool模式 257 第23章 Factory Method模式 267 第24章 工厂模式的总结 272 第八部分 终点与起点 第25章 设计模式回顾:总结与...
DataSource的单态模式(SingleTon)程序---马克-to-win java视频 数据源 单态模式 dataSource Singleton
创建型模式(Creational Pattern) 是对类的实例化过程的抽象化。一些系统在创建对象时,需要动态地决定怎样创建对象,创建哪些对象,以及如何组合和表示这些... 创建型模式分为类的创建型模式和对象的创建型模式。
perl-Class-Singleton-1.4-6.el6.noarch.rpm perl-Class-Singleton-1.4-6.el6.noarch.rpm
双重检测锁(Double-Checked Locking)实现的Singleton模式在多线程应用中有相当的价值。在ACE的实现中就大量使用ACE_Singleton模板类将普通类转换成具有Singleton行为的类。这种方式很好地消除了一些重复代码臭味,...
python库。 资源全名:django-singleton-admin-0.0.2.macosx-10.7-intel.exe
• Chapter 21: The Singleton Pattern and the Double-Checked Locking Pattern • Chapter 22: The Object Pool Pattern • Chapter 23: The Factory Method Pattern • Chapter 24: Summary of Factories (no ...
C#视频-面向对象设计模式纵横谈(2):Singleton 单件(创建型模式)
Java常用设计模式(SingleTon、FactoryMethod、AbstractFactory)
C#设计模式(7)-Singleton Pattern C#设计模式(6)-Abstract Factory Pattern C#设计模式(5)-Factory Method Pattern C#设计模式(4)-Simple Factory Pattern C#设计模式(3) - 设计原则(2) C#设计模式(2...
设计模式总结-模板设计模式,单例模式(singleTon)
里面包含了23中设计模式源代码,其中包括工厂模式(Factory)、单例(Singleton)、观察者模式(Observer)、适配器模式(Adapter)、Template模式、Decorate模式、proxy模式等 这些代码对于初学者看起来稍微复杂一些,我...
设计模式精解-GoF 23 种设计模式解析附 C++实现源码 目 录 引 言 0.1 设计模式解析(总序) 0.2 设计模式解析后记 0.3 与作者联系 1 创建型模式 1.1 Factory模式 1.2 AbstactFactory模式 1.3 Singleton...
设计模式-Singleton与Factory
常见设计模式的解析和实现(C++),真的很经典,我也在学 常见设计模式的解析和实现(C++)之一-Factory模式 常见设计模式的解析和实现(C++)之二-Abstract ...常见设计模式的解析和实现(C++)之五-Singleton模式 .........
本资源为 "大话西游之设计模式_从猴王出世看singleton"文章的配套代码,通过该代码,可以更加清晰的了解猴王出世故事的流程及代码模拟,也能清楚的知道singleton的全部内容。 该代码在java环境开发,可以正常运行,...
java singleton 不解释不解释不解释不解释
设计模式精解- GoF 23 种设计模式解析附 C++实现源码 目 录 0 引言 ...........................................................................................................................................
代码都可以直接运行,部分设计模式有多种实现,主要的设计模式如下:Creational-abstract_factory,Creational-factory_method,Creational-simple_factory,Creational-singleton,Creational-builder,Creational-...