多线程环境下的单例模式_多线程中使用单例模式-程序员宅基地

package com.yunding.concurrent;

/**
 * 多线程环境下的单例模式: doubleChecked + volatile (双重检测 + 避免happenBefore)
 * 
 * 实例化对象的三个步骤: 1. 开辟空间 2. 初始化对象 3. 把对象的地址赋给引用变量
 * 
 * @author beOkWithAnything
 *
 */
public class DoubleCheckedLocking {

	/**
	 * 3. 提供 volatile修饰的 私有的静态属性 DoubleChecking 可能会存在指令重排(happenBefore):
	 * 如果初始化操作比较耗时,可能会发生指令重排:对象未初始化完成就把对象的地址赋给引用变量
	 * 由于存在DoubleChecking,新的线程就会访问到未初始化完成的对象,加入volatile来避免指令重排(保证对象使用时内容同步更新)
	 */
	private static volatile DoubleCheckedLocking instance;

	// 构造器私有化
	private DoubleCheckedLocking() {
	}

	// 提供公共的静态方法: 获取属性
	public static DoubleCheckedLocking getInstance() {

		/**
		 * 2. 已经存在对象时: 避免不必要的同步
		 * 如果没有双重检测(DoubleChecked),每个线程都要去等待当前持有instance锁的线程判断完成才能返回实例
		 */
		if (null != instance) {
			return instance;
		}
		/**
		 * 1. 加锁: 如果初始化对象的步骤比较耗时,多线程环境下不加锁会 重复创建对象
		 */
		synchronized (instance) {
			if (null == instance) {
				instance = new DoubleCheckedLocking();
			}
		}
		return instance;
	}

}

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/swq463/article/details/94289199

智能推荐

Proteus 里面library文件夹找不到,怎么找到library文件夹。_protues没有library-程序员宅基地

文章浏览阅读6.6k次,点赞5次,收藏10次。Protus 里面library文件夹找不到,怎么找到library文件夹。因为需求需要找到library文件夹,往这个文件夹中复制一些文件。可是找到Proteus的根目录,却怎么也找不到这个文件夹。当然找不到,就没办法复制了。最后发现在它藏在一个隐藏的文件夹里面。怎么找到这个隐藏的文件夹呢?就在上面这个框起来的地方打对勾就可以看到被隐藏的文件夹了。我是在下面这个文件夹中找到的。具体路径如下:C:\ProgramData\Labcenter Electronics\Proteus 8 Pr_protues没有library

wifi配置工具iw源码解析_iw 源码-程序员宅基地

文章浏览阅读6k次,点赞2次,收藏22次。iw是一个基于nl80211接口的无线配置工具,用于替代原先基于wext接口的iwconfig。iw源码可以在网址 https://www.kernel.org/pub/software/network/iw/ 获取,或者使用git命令从http://git.kernel.org/?p=linux/kernel/git/jberg/iw.git. 中下载。1、简单的nl80211程序i..._iw 源码

Chrome NET::ERR_CERT_AUTHORITY_INVALID 错误分析及处理-程序员宅基地

文章浏览阅读7.3w次。Chrome NET::ERR_CERT_AUTHORITY_INVALID 错误分析及处理_chrome net::err_cert_authority_invalid

reactnative 设置背景图片--ImageBackground_react native 背景图片-程序员宅基地

文章浏览阅读2.3w次。在RN版本0.46版本的时候添加了ImageBackground控件。ImageBackground可以设置背景图片,使用方法和image一样,里面嵌套了其他的组件 <ImageBackground style={{ flex: 1 }} source={require('../../res/image/login_beijing.png')}> ..._react native 背景图片

Python 框架 之 Django 的数据后台管理平台,简单的搭建、以及数据基本操作_python数据管理平台作用-程序员宅基地

文章浏览阅读3k次,点赞2次,收藏25次。Python 框架 之 Django 的数据后台管理平台,简单的搭建、以及数据基本操作目录Python 框架 之 Django 的数据后台管理平台,简单的搭建、以及数据基本操作一、简单介绍二、实现原理三、注意实现四、效果预览五、创建数据管理后台账户,登录后台管理六、注册模型类,以及添加自定义模型管理类,调整数据显示七、后台管理的数据基本操作八、关键代码一、简单介绍Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型..._python数据管理平台作用

HBP-1100U 欧姆龙血压计的USB调用方法_欧姆龙hbp1100u说明书-程序员宅基地

文章浏览阅读4.8k次。安装HIDcontroller控件。1、用USB设备名获取VID,PID,建立临时缓冲区。2、checkout建立usb设备的线程3、拔插下来checkin销毁线程4、通过ondata事件获取数据指针5、通过数据指针对16进制数进行转换10进制,并处理显示unit Unit1;interfaceuses Windows, Messages, SysUtils, Var..._欧姆龙hbp1100u说明书

随便推点

LWN: 使用TuxMake来确保kernel编译结果可重现!-程序员宅基地

文章浏览阅读222次。关注了就能看到更多这么棒的文章哦~Portable and reproducible kernel builds with TuxMakeJanuary 5, 2021This arti..._make --silent

Docker容器开机自动启动(在宿主机重启后或者Docker服务重启后)-程序员宅基地

文章浏览阅读1k次。一、环境介绍系统版本:CentOS6.7 X64内核版本:2.6.32-573.18.1.el6.x86_64二、测试过程使用在Docker run的时候使用--restart参数来设置。no - container:不重启on-failure - container:退出状态非0时重启always:始终重启[root@docker~]#dockerrun-i-t..._centos重启之后,启动的docker容器关闭了,怎么解决

为什么很多程序员工作时都戴耳机?-程序员宅基地

文章浏览阅读121次。点击上方“芋道源码”,选择“设为星标”做积极的人,而不是积极废人!源码精品专栏中文详细注释的开源项目RPC 框架 Dubbo 源码解析网络应用框架 Netty 源码解析消息中间件 Ro..._程序员上班带耳机

theanorc-程序员宅基地

文章浏览阅读93次。[global]device = cpufloatX = float32cxx = icpcmode = FAST_RUNopenmp = Trueopenmp_elemwise_minsize = 10allow_gc = False#profile = True[gcc]cxxflags = -qopenmp -march=native -O3 -qopt-report=..._theanorc

钉钉应用开发,提示Warning: Invalid CERT Authority-程序员宅基地

文章浏览阅读3.7k次。我司的网页应用与钉钉进行了单点登录的对接,结果在钉钉App中打开提示SSLerror,顶上的提示是Warning: invalid CERT Authority。点击Yes可以正常访问,只是每次提示很麻烦。应用是Nginx+Tomcat架构,在Nginx中配置了https访问。解决方法:ssl_certificate配置的文件名是xxx.crt将文件名重命名为xxx.pem修改Nginx配置文件里关联的文件名为xxx.pem重启Nginx后解决。..._invalid cert authority

Javascript数据类型(number 、string、booledn、undefined 、null)_number类型怎么赋值为空-程序员宅基地

文章浏览阅读1.1k次。计算机世界中的万事万物都是数据。计算机程序可以处理大量的数据,为什么要给数据分类?1. 更加充分和高效的利用内存2. 也更加方便程序员的使用数据JS数据类型整体分为两大类:1.基本数据类型number 数字型string 字符串型booledn 布尔型undefined 未定义型null 空类型2.引用数据类型object 对象function 函数array 数组数据类型 – 数字类型(number)即我们数..._number类型怎么赋值为空

推荐文章

热门文章

相关标签