多线程下的单例模式

本文探讨了在多线程环境中如何利用volatile关键字优化单例模式的实现,同时提到了使用枚举创建单例的方式,但作者表示对此尚不完全理解。内容参考了《java多线程编程实战指南》。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//大家都知道的单例
public class OneThreaDSingle {
	public OneThreaDSingle newSingle = null;

	private OneThreaDSingle(){

	}

	public OneThreaDSingle getIntence(){
		if(newSingle == null){
			newSingle = new OneThreaDSingle();
		}
		return newSingle;
	}
}

//多线程下的单例:
public class MultithreadingSingle {
	public MultithreadingSingle multitSingle = null;
	private MultithreadingSingle(){
	}
	public MultithreadingSingle getInstance(){
		//在使用锁之前进行判断,可以减少锁的造成的效率不高问题
		if(multitSingle == null) {
			synchronized (MultithreadingSingle.class) {
				if (multitSingle == null) {//此不可少
					multitSingle = new MultithreadingSingle();
				}
			}
		}
		return multitSingle;
	}
}

使用volatile关键字,在上一个方法中更上一层楼

public class VolatilemMultitSingle {
	public volatile VolatilemMultitSingle volatilSingle = null;
	private VolatilemMultitSingle(){
	}
	public VolatilemMultitSingle getInstance(){
		if(volatilSingle == null){
			synchronized (VolatilemMultitSingle.class){
				if(volatilSingle == null){
					/**
					 * 该操作可底层分解为三个步骤
					 * 1、创建控件
					 * 2、初始化
					 * 3、对象引用指向变量
					 * 这三个步骤处理器出于优化的目的可能会重排序,
					 * 可能将2和三对调,造成获得的对象不是想要的对象
					 * 而volatile的作用就是限制重排序
					*/
					volatilSingle = new VolatilemMultitSingle();
				}
			}
		}
		return volatilSingle;
	}

}

//最简单的单例

public class StaticInnerClassSingle {
		private StaticInnerClassSingle()
		}
		private static class InitializeSingle{
			final static StaticInnerClassSingle staticSingle = new StaticInnerClassSingle();
		}
		/**
		 * 调用该方法时,内部类InitializeSingle初始化,
		 * StaticInnerClassSingle对象是静态变量,只会初始化一次
		*/
		public StaticInnerClassSingle getInstance(){
			return InitializeSingle.staticSingle;
		}
}

还有一种方法是用枚举创建单例,这个楼主不是很理解,先不写。

参考:《java多线程编程实战指南》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值