IT培训学校
IT设计、软件测试、前端、大数据等IT培训课程
北京、上海、广州、深圳等多个城市有校区
达内时代科技集团致力于培养面向电信和金融领域的Java、C++、C#/.Net、3G/Android、3G/IOS、 PHP、嵌入式、软件测试、UID、网络营销、网络工程、会计、UED、web、Unity3D、大数据、童程童美等17大方向中高端软件人才课程与少儿教育课程,先后获得美国国际数据集团IDG、集富亚洲JAFCO ASIA、美国高盛银行的三轮投资,是国内首家获得国际风险投资的IT职业教育机构...
IT设计、软件测试、前端、大数据等IT培训课程
北京、上海、广州、深圳等多个城市有校区
对于Java程序,有时需要延迟一些费用较大的对象的初始化操作,只有在使用时才能初始化。那就是所谓的延迟初始化或懒装载。
查看是否存在不安全延迟初始化:
当A线程执行1时,发现对象instance为null,准备对其进行new,但B线程先new,从而导致错误。
可利用同步锁,以确保正确:
但由于同步整个方法的开销过高,因此出现了双重检查锁:
使用双重检查的最小范围使用的同步锁似乎达到了目的,但在A行程4执行时,线程B的7还没有完成,线程A判定instance的问题发生了7=null.线程B尚未执行完,这是为什么?
检查newInstance的基本关键实现:
实际上,首先执行1分配内存,然后初始化对象并设置instance.然后这里就有了重排,可以替换2和3的顺序:
所以当B也完成了7时,A在4中判断instance对象已完成初始化,如果在启动ctorInstance之前就去调用instance,那么就会出现错误。
两种解决方案
将实例对象声明为volatile,这样它就不能被重新排列2到3次。
利用基于类初始化的解决方案:JVM在类初始化阶段(即加载Class后和线程使用前)实施类初始化。
JVM在执行类的初始化过程中将获得一个锁。该锁可以同步同一类的多个线程初始化。
在类初始化的基础上,我们发现实现代码更加简洁。然而,基于易失性的双重检查锁定方案有一个额外的优势:它可以在静态字段上实现延迟初始化,而不是实例字段。域延迟初化虽然减少了初化类和实例制作的费用,但是延迟初化访问域的费用会增加。
大多数情况下,正常初始化比延迟初始化好。若确实需要对实例字段进行线程安全的延迟初始化,则使用上面介绍的基于volatile的延迟初始化方案;如果确实需要对静态字段进行线程安全的延迟初始化,则使用上面介绍的基于类初始化方案。
以上就是小编为大家介绍的Java双检锁实现代码,希望对大家有所帮助。
对IT设计有兴趣,希望从事IT行业
强化自己能力,加强专业技能
丰富职场技能,毕业不失业
提升专业水平,轻松升职加薪
HTML5
Java
Python
全链路设计
云计算
软件测试
达内国际集团率先在美国上市第一家IT职业教育机构,率先推出“先就业,后付款”IT信贷就业培训的IT职业教育,率先获得国际风险投资的IT职业教育机构,率先入选“德勤中国高科技高成长50强”的IT职业教育机构,率先由IT技术专家建立和运营的IT职业教育机构,率先全面开放课堂,随时真课试听的IT职业教育机构。达内国际集团率先与“211工程”大学联合培养软件工程硕士的IT职业教育机构,率先真实披露学员就业率、就业品质的IT职业教育机构,率先开辟高端课程,培养IT白领、金领的IT职业教育机构,率先完全真实公开师资背景的IT职业教育机构,达内国际集团由于优秀的教学效果、行业领先的经营模式和倾力公益事业赢得了社会各界的广泛赞誉和好评。
大数据
智能物联网
Unity游戏开发
网络安全
互联网营销
影视剪辑包装