多线程单利模式之双检锁必要性

static CSingleton* GetInstance()

{

if( m_pInstance == NULL )              //优化性能,总比锁快

{

CAutoLock  lock( &cs );              //防止多线程引起的同步问题

if( m_pInstance == NULL )          //确保该段代码进入单线程模式,開始可靠性推断

{

m_pInstance  =  new CSingleton;

}

}

return m_pInstance;

}

2014年11月19日15:54:52

时间: 2024-11-09 00:30:34

多线程单利模式之双检锁必要性的相关文章

DCL双检锁的失效:现实与初衷的背离

最近看了Brian Goetz写的一篇有关DCL的文章:Double-checked locking: Clever, but broken.( 2001年发表于JavaWorld上) 这篇文章讲述了DCL设计的初衷,但是因为JVM的不同实现(没有严格遵循JMM规范)导致DCL在实际应用中失效. 1. DCL的设计初衷 DCL是为了支持 Lazy initialization而设计的. 我们有多种方式去实现单例模式: Eager initialization: 饿加载,当类加载器加载类时就初始化

Java设计模式-单利模式

单例模式 作为对象的创建模式,单例模式确保其某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类.单例模式有以下特点: 1.单例类只能有一个实例 2.单例类必须自己创建自己的唯一实例 3.单例类必须给其他所有对象提供这一实例 下面看一下单例模式的三种写法,除了这三种写法,静态内部类的方式.静态代码块的方式.enum枚举的方式也都可以,不过异曲同工,这三种方式就不写了. 首先声明就是 在我们项目工程中 我们完全不用使用懒汉式 因为有锁使用的地方就有效率低的存在: 饿汉式

单利模式的优缺点和使用场景

文章转自:http://www.tools138.com/create/article/20150929/020009847.html 首先介绍一下单例模式:     单例模式(Singleton),也叫单子模式,是一种常用的软件设计模式.在应用这个模式时,单例对象的类必须保证只有一个实例存在.许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为.比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这

设计模式之单利模式

单利模式应该是开发中用的最多的一种. 单例设计模式目的: 解决一个类在内存中只存在一个对象 想要保证对象唯一,实现思路: 1.为了避免其他程序过多建立该类对象,先禁止其他程序建立该类对象 2.还为了其他程序可以访问到该类对象,只好在本类中自定义一个对象 3.为了方便其他程序对自定义对象的访问,可以对外提供访问方式 代码体现: 1.将构造函数私有化 2.在类中创建一个本类对象 3.提供一个方法,可以获取到该对象 方式一:饿汉式 //饿汉式 class Single { private Single

Java设计模式の单利模式

单利模式:确保一个类最多只有一个实例,并提供一个全局访问点. 经典单利模式创建对象代码 public class Singleton { private static Singleton uniqueInstance = null; private Singleton(){ } public static Singleton getInstance(){ if (uniqueInstance==null) { uniqueInstance=new Singleton(); } return un

Java多线程编程模式实战指南(三):Two-phase Termination模式--转载

本文由本人首次发布在infoq中文站上:http://www.infoq.com/cn/articles/java-multithreaded-programming-mode-two-phase-termination.转载请注明作者: 黄文海 出处:http://viscent.iteye.com. 停止线程是一个目标简单而实现却不那么简单的任务.首先,Java没有提供直接的API用于停止线程.此外,停止线程时还有一些额外的细节需要考虑,如待停止的线程处于阻塞(等待锁)或者等待状态(等待其它

Java多线程Future模式

Java多线程Future模式有些类似于Ajax的异步请求Future模式的核心在于:去除了主函数的等待时间,并使得原本需要等待的时间段可以用于处理其他业务逻辑 假设服务器的处理某个业务,该业务可以分成AB两个过程,并且AB两个过程之间不需要彼此的返回结果 A过程需要1秒钟,B过程需要2秒钟,主线程其他操作2秒钟按照正常编写,程序大概需要执行5秒如果按照Future模式只需要执行2秒(取其中运行时间最久的线程的运行时间) Future模式的核心实现在于两个方面 1.多线程运行 主线程采用多线的方

Java多线程编程模式实战指南(三):Two-phase Termination模式

停止线程是一个目标简单而实现却不那么简单的任务.首先,Java没有提供直接的API用于停止线程.此外,停止线程时还有一些额外的细节需要考虑,如待停止的线程处于阻塞(等待锁)或者等待状态(等待其它线程).尚有未处理完的任务等.本文介绍的Two-phase Termination模式提供了一种通用的用于优雅地停止线程的方法. Two-phase Termination模式简介 Java并没有提供直接的API用于停止线程.Two-phase Termination模式通过将停止线程这个动作分解为准备阶

单利模式

菜鸟编写后台代码的时候,应为前台通过ajax与后台交互,所以后台通过Map与前台通信,每次都使用Map,因此考虑到建立一个单例的Map,在一个Controller中使用.(在整个后台都使用一个Map好像不合适,后台有多个功能,每个功能都有可能被用到) 单例模式有一下几类: 1.懒汉模式: 在使用的地方创建对象,起到延时加载的作用,但是容易产生线程安全的问题. 2.饿汉模式 在类创建的同时已经创建了一个静态变量供使用(一开始就亟不可待的创建了对象,饿汉比较形象的表面了这一点),因此不存在线程安全的