首页 > 其他 > 详细

双检锁(DCL)的分析

时间:2020-12-07 09:40:41      阅读:21      评论:0      收藏:0      [点我收藏+]
public class Singleton
{
	private static volatile Singleton instance;
	private Singleton() {}
	public static Singleton getInstance()
	{
		if(instance==null)
		{
			synchronized(Singleton.class)
			{
				if(instance==null)
				{
					instance = new Singleton();
				}
			}
		}
		return instance;
	}
}

1、第二个if(instance==null)判断的原因:

  • 首个线程在进入同步块创建对象的过程中,可能有其他线程通过第一个判断试图进入同步块,此时会被阻塞在同步块队列中;
  • 当首个线程创建完毕后,同步块阻塞队列中的线程会进入同步块,此时instance!=null,防止了对象再创建

2、volatile作用:

在对象创建阶段,对象创建不是原子操作,可以分为:

  1. 在堆中分配对象内存空间

  2. 执行构造方法,初始化对象

  3. 将引用instance指向这个对象的堆内地址

此时2、3步可能发生重排,使instance指向一个未创建完成的对象;此时若有线程要获取instance,则会获取到这个还未创建完成的对象,发生错误

双检锁(DCL)的分析

原文:https://www.cnblogs.com/snm511/p/14095151.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!