多线程环境下的单例模式

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;
	}

}

 

全部评论

相关推荐

点赞 评论 收藏
分享
一名愚蠢的人类:多少games小鬼留下了羡慕的泪水
投递荣耀等公司10个岗位
点赞 评论 收藏
分享
最近又搬回宿舍了,在工位坐不住,写一写秋招起伏不断的心态变化,也算对自己心态的一些思考表演式学习从开始为实习准备的时候就特别焦虑,楼主一开始选择的是cpp后端,但是24届这个方向已经炸了,同时自己又因为本科非92且非科班,所以感到机会更加迷茫。在某天晚上用java写出hello world并失眠一整晚后选择老本行干嵌入式。理想是美好的,现实情况是每天忙但又没有实质性进展,总是在配环境,调工具,顺带还要推科研。而这时候才发现自己一直在表演式学习,徘徊在设想如何展开工作的循环里,导致没有实质性进展。现在看来当时如果把精力专注在动手写而不是两只手端着看教程,基本功或许不会那么差。实习的焦虑5月,楼主...
耶比:哲学上有一个问题,玛丽的房间:玛丽知道眼睛识别色彩的原理知道各种颜色,但是她生活在黑白的房间里,直到有一天玛丽的房门打开了她亲眼看到了颜色,才知道什么是色彩。我现在最大可能的减少对非工作事情的思考,如果有一件事困扰了我, 能解决的我就直接做(去哪里或者和谁吵架等等……),解决不了的我就不想了,每一天都是最年轻的一天,珍惜今天吧
投递比亚迪等公司10个岗位 > 秋招被确诊为…… 牛客创作赏金赛
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务