`
wangyanlong0107
  • 浏览: 499816 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
社区版块
存档分类
最新评论

【转】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模式

 

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)将只被装载一次,所以只会创建一个对象。

分享到:
评论

相关推荐

    C++ and the Perils of Double Checked Locking.zip

    《C++ and the Perils of Double Checked Locking》是一篇探讨C++编程中双重检查锁定(Double-Checked Locking)模式潜在问题的文献。在多线程编程中,双重检查锁定是一种常见的优化策略,旨在减少对同步原语的依赖...

    软件体系结构---设计模式的java运行代码案例

    在软件开发领域,软件体系结构是构建复杂系统的基础,它定义了系统的组件、它们之间的关系以及指导其设计和实现的原则。设计模式则是软件体系结构中的重要组成部分,它们是经过时间检验的解决方案模板,用于解决常见...

    设计模式精解-GoF-23种设计模式解析--附C++源代码

    C++源代码文件可以帮助你更好地理解如何在实际项目中应用这些模式,通过阅读和分析代码,你可以学习如何在C++中实现这些设计模式,并将它们融入到自己的编程实践中。 总而言之,设计模式是软件开发中的宝贵财富,...

    23种经典设计模式UML类图汇总.chm_23种经典设计模式UML类图汇总.chm_uml_

    通过理解并熟练运用这些设计模式,开发者可以提高代码的可复用性、可维护性和可扩展性,同时UML类图可以帮助我们更直观地理解模式之间的关系和对象间的交互,提高团队沟通效率。对于学习和实践面向对象设计的程序员...

    GOF 23设计模式UML图

    通过"23个设计模式.pdf"这份文档,你可以深入理解这23种设计模式的原理、意图、结构和实现。"Visio UML Diagrams"则提供了用UML(统一建模语言)展示这些模式的图形表示,帮助你直观地理解每个模式的类和对象间的...

    singleton设计模式java实现及对比

    **Singleton设计模式** Singleton设计模式是软件工程中最...综上所述,Singleton模式的实现方式各有优劣,选择哪种方式取决于具体的应用场景和性能需求。在实际开发中,应根据项目需求选择最适合的Singleton实现方式。

    Java常用设计模式(SingleTon、FactoryMethod、AbstractFactory)

    Java设计模式是面向对象编程中的重要概念,它们是解决常见问题的经验总结,为代码的可重用性、可维护性和可扩展性提供了指导。这里我们将深入探讨三种常见的Java设计模式:单例(Singleton)、工厂方法(Factory ...

    设计模式解析-英文

    各种工厂模式 242 第21章 Singleton模式和Double-Checked Locking模式 249 第22章 Object Pool模式 257 第23章 Factory Method模式 267 第24章 工厂模式的总结 272 第八部分 终点与起点 第25章 设计模式回顾:总结与...

    设计模式专题---设计模式示例代码(全)(python--c++)

    本专题涵盖了多种设计模式的示例代码,包括Python和C++两种编程语言实现,旨在帮助开发者更好地理解和应用这些模式。 1. **Builder模式**:Builder模式是一种创建型设计模式,它提供了一种创建对象的抽象方法,使得...

    UML及软件设计模式

    **UML(统一建模语言)** UML是Unified Modeling Language的缩写,是...UML作为建模工具,帮助我们可视化和理解系统,而设计模式则提供了在各种场景下解决问题的模板,两者结合使用,能有效提升软件开发的效率和质量。

    C++完美实现Singleton模式

    为了解决这一问题,可以采用双重检查锁定(Double-Checked Locking)模式来确保线程安全性: ```cpp class Singleton { public: static Singleton* Instance() { if (_instance == nullptr) { lock_guard<mutex>...

    设计模式专题之(一)单例模式---设计模式单例模式模式示例代码(python--c++)

    单例模式是软件设计模式中的一种基础且广泛应用的模式,其主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式在资源管理、配置对象、缓存等场景下非常常见,因为它可以避免因频繁创建和销毁对象而...

    设计模式代码(包含uml类图、和实验报告)

    通过C++语言实现,配合详细的文档和UML类图,为学习者提供了全面理解和掌握设计模式的良好平台。 实验一至实验八涵盖了多种经典的设计模式,这些模式通常被分为三类:创建型、结构型和行为型模式。 1. **创建型...

    uml设计模式ppt

    这种模式将抽象和实现解耦,提供了更好的灵活性。 5. **11 设计模式(5)--Command模式.ppt** - **Command模式**:命令模式将请求封装为一个对象,从而使您可以用不同的请求参数化其他对象。命令模式也支持可撤销的...

    DataSource的单态模式(SingleTon)程序---马克-to-win java视频

    DataSource的单态模式(SingleTon)程序---马克-to-win java视频 数据源 单态模式 dataSource Singleton

    Practical Object-Oriented Design With UML - McGraw-Hil

    - **封装(Encapsulation)**:隐藏对象的内部状态和实现细节,仅通过接口暴露有限的操作。 - **多态(Polymorphism)**:同一个操作作用于不同的对象,可以有不同的解释,从而产生不同的执行结果。 #### 统一建模语言...

    23种设计模式的java源代码实现.rar

    在Java中,通常使用双重检查锁定(Double-Checked Locking)或者静态内部类的方式来实现线程安全的单例。 4. **享元(Flyweight)模式**:用于减少创建和管理大量相似对象的成本。在Java中,享元模式常用于节省内存...

    UML设计模式_9_设计模式(3)--Factory_Singleton模式

    创建型模式(Creational Pattern) 是对类的实例化过程的抽象化。一些系统在创建对象时,需要动态地决定怎样创建对象,创建哪些对象,以及如何组合和表示这些... 创建型模式分为类的创建型模式和对象的创建型模式。

    C#面向对象设计模式纵横谈-1.Singleton 单件(创建型模式)

    Singleton模式的实现有多种变体,例如懒汉式(Lazy Initialization)、饿汉式(Eager Initialization)和双检锁/双重检查锁定(Double-Check Locking)。懒汉式是在第一次使用时才创建实例,而饿汉式则是在类加载时...

    计算机后端-Java-图解java设计模式代码.zip

    1. **创建型设计模式**:这类模式主要关注对象的创建过程,如单例模式(Singleton)、工厂方法模式(Factory Method)、抽象工厂模式(Abstract Factory)、建造者模式(Builder)和原型模式(Prototype)。...

Global site tag (gtag.js) - Google Analytics