`

深入浅出设计模式五——独一无二(单例模式)

阅读更多

先看文章 :http://quicker.iteye.com/blog/579948

 

public class Singleton {
	private Singleton(){}
	private static Singleton st = new Singleton();//这句话保证了线程安全。
	//在类加载的时候初始化,new出对象,也就是说每加载一次类就new 一次
	public static Singleton getInstance(){
		return st;
	}
	
}

class LazySingleton{
	private LazySingleton(){}
	private static LazySingleton st = null;
	//第一次加载,对st初始化为null,调用getInstance方法后,对st进行实例化。
	//以后再加载的时候会发现st已经指向了对象,直接执行return st.
	//要保证线程安全,必须加synchronized关键字。
	public static synchronized LazySingleton getInstance(){
		if(st == null)
			st =  new LazySingleton();
		return st;
	}
}


/*
 * 对第二种利用synchronized保证线程安全的情况进行改进,因为线程安全问题只出现在第一次调用getInstance方法时,
 * 当st被实例化之后,就不存在线程安全问题了。所以下例我们只在第一次调用getInstance方法时,并且st为空的时候才
 * 检查线程的安全性。注意volatile关键字的使用。这叫“双重检查加锁”,减少使用同步。
 */
class DoubleCheckSingleton{
	
	private DoubleCheckSingleton(){}
	private volatile static DoubleCheckSingleton st ;
	public static DoubleCheckSingleton getInstance(){
		if(st == null){
			synchronized (DoubleCheckSingleton.class) {
				if(st == null){
					st =  new DoubleCheckSingleton();
				}
			}
		}
	
		return st;
	}
}
class Test{
	public static void main(String[] args) {
		Singleton st1 = Singleton.getInstance();
		Singleton st2 = Singleton.getInstance();
		System.out.println(st1==st2);
		
		LazySingleton lzSt1 = LazySingleton.getInstance();
		LazySingleton lzSt2 = LazySingleton.getInstance();
		System.out.println(lzSt1==lzSt2);
		
		DoubleCheckSingleton dcs1 = DoubleCheckSingleton.getInstance();
		DoubleCheckSingleton dcs2 = DoubleCheckSingleton.getInstance();
		System.out.println(dcs1==dcs2);
	}
}

 关于关键字:volatile

 Volatile修饰的成员变量在每次被线程访问时,都强迫从共享内存中重读该成员变量的值。而且,当成员变量发生变化时,强迫线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。 

 

使用建议:在两个或者更多的线程访问的成员变量上使用volatile。当要访问的变量已在synchronized代码块中,或者为常量时,不必使用。 

 

在大多数情况下,把变量缓存在寄存器中是一个非常有价值的优化方法,如果不用的话很可惜。C和C++给你提供了显式禁用这种缓存优化的机会。如果你声明变量是使用了volatile修饰符,编译器就不会把这个变量缓存在寄存器里——每次访问都将去存取变量在内存中的实际位置
由于使用volatile屏蔽掉了VM中必要的代码优化,所以在效率上比较低,因此一定在必要时才使用此关键字

 

分享到:
评论

相关推荐

    深入浅出设计模式一——Duck设计(策略模式)

    《深入浅出设计模式一——Duck设计(策略模式)》 在软件开发中,设计模式是一种被广泛接受并重复使用的解决方案,它针对特定问题提供了一种通用的、可复用的设计方案。策略模式是其中一种行为设计模式,用于定义...

    深入浅出设计模式(中文版)

    《深入浅出设计模式》是一本面向Java开发者的专业书籍,旨在帮助读者理解并熟练应用设计模式。设计模式是软件工程中的重要概念,它总结了在特定情境下解决常见问题的最佳实践,是经验丰富的开发者们智慧的结晶。这...

    深入浅出设计模式三——Beverage实现(装饰者模式)

    "深入浅出设计模式三——Beverage实现(装饰者模式)"这一标题指出,我们将探讨如何使用装饰者模式来实现一个饮品系统。装饰者模式是一种结构型设计模式,它允许我们在运行时向对象添加新的行为或职责,而无需修改对象...

    深入浅出设计模式 完整扫描版

    《深入浅出设计模式》总结了许多系统软件在设计开发过程中的难点,力图将设计模式的实际应用与实现原理有机结合起来,破解软件开发人员在学习设计模式过程不能透彻理解并灵活运用设计模式的难题。  所有章节都是先...

    深入浅出设计模式二——WeatherData设计(观察者模式)实现二

    在本文中,我们将深入探讨设计模式中的"观察者模式",并以`WeatherData`为例进行具体实现。观察者模式是一种行为设计模式,它允许我们定义一个订阅机制,当对象状态发生变化时,可以通知所有依赖它的观察者。这种...

    深入浅出设计模式四——多区域比萨加盟店生产比萨实现(抽象工厂模式)

    今天我们将深入探讨“抽象工厂模式”(Abstract Factory Pattern),它在“深入浅出设计模式四——多区域比萨加盟店生产比萨实现”中得到了应用。这个模式主要用于创建一系列相关的对象,而无需指定其具体的类。 ...

    深入浅出设计模式二——WeatherData设计(观察者模式)实现一

    在本文中,我们将深入探讨设计模式中的一个经典案例——观察者模式(Observer Pattern),通过具体的实现来理解其工作原理。观察者模式是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生...

    深入浅出设计模式附书源码Java版源码

    深入浅出设计模式附书源码Java版源代码,是面向Java开发者的宝贵资源,旨在帮助他们理解和实践各种设计模式。这本书籍的源代码提供了实际的示例,使得学习过程更具互动性和实践性。 设计模式的核心思想是将常见的...

    深入浅出设计模式四——比萨店生产比萨实现(工厂方法模式)

    本文将深入探讨“工厂方法模式”,并结合比萨店生产比萨的实例来解析这一模式的运用。首先,我们要理解工厂方法模式的核心思想:定义一个创建对象的接口,但让子类决定实例化哪一个类。这样,工厂方法可以把类的实例...

    深入浅出密码学——常用加密技术原理与应用_深入浅出密码学——常用加密技术原理与应用_

    深入浅出密码学——常用加密技术原理与应用Cryptanalysis in simple terms -- principle and application of common encryption technology

    免费电子书《深入浅出设计模式》PDF版.rar

    《深入浅出设计模式》是一本深受欢迎的编程书籍,主要涵盖了软件工程中常见的设计模式。设计模式是软件开发人员在解决特定问题时形成的可复用解决方案,它们代表了最佳实践,可以提高代码的可读性、可维护性和可扩展...

    深入浅出java设计模式(高清中文PDF)

    《深入浅出Java设计模式》是一本专注于Java编程领域中的设计模式专著,旨在帮助开发者深化对设计模式的理解,提高代码质量和可维护性。设计模式是软件开发中经过时间检验的解决方案,它们是解决常见问题的最佳实践。...

    深入浅出设计模式C#Java版

    本资源"深入浅出设计模式C#Java版"是针对这两种主流编程语言介绍设计模式的经典著作,旨在帮助开发者理解和应用这些模式。 1. **单例模式**:确保一个类只有一个实例,并提供全局访问点。在C#中,可以使用`密封`和`...

    深入浅出设计模式之单件模式

    ### 深入浅出设计模式之单件模式 #### 一、单件模式概述 单件模式(Singleton Pattern)是软件设计模式中最为常见的一种,它的主要目标是确保某个类只有一个实例,并提供一个全局访问点。单件模式在很多情况下都...

    深入浅出设计模式封面 封底 序 前言 目录

    《深入浅出设计模式》是一本面向广大软件开发者和架构师的重要参考资料,它旨在帮助读者理解和掌握设计模式这一核心的软件工程概念。设计模式是经过长期实践和验证的、在特定场景下解决常见问题的有效解决方案,是...

    深入浅出设计模式.rar

    《深入浅出设计模式》这个压缩包文件很可能是为了帮助读者理解和掌握设计模式的核心理念与应用场景,从而提升软件开发的效率和质量。 在软件开发过程中,设计模式如同一种通用的语言,让开发者能够快速交流复杂的...

    深入浅出设计模式

    《深入浅出设计模式》是一本专注于讲解设计模式的书籍,其内容旨在帮助读者深入理解并熟练运用设计模式。设计模式是软件开发中的一种最佳实践,是解决常见问题的模板,能够提高代码的可读性、可维护性和复用性。这...

    深入浅出Cortex-M7——i.MX RT1050

    《深入浅出Cortex-M7——i.MX RT1050》这本书是关于嵌入式微控制器领域的经典之作,主要聚焦于ARM公司的Cortex-M7内核以及NXP半导体的i.MX RT1050系列芯片。Cortex-M7是ARM针对微控制器市场设计的一种高性能、低功耗...

    深入浅出设计模式.pdf

    《深入浅出设计模式》是一本关于软件设计的经典著作,主要涵盖了面向对象设计中的核心设计模式。这本书旨在帮助读者理解并掌握如何在实际编程中应用这些模式,提升代码的可维护性和可扩展性。设计模式是经过时间和...

Global site tag (gtag.js) - Google Analytics