从品牌网站建设到网络营销策划,从策略到执行的一站式服务
今天就跟大家聊聊有关使用java怎么实现双重检查锁定,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
在Java程序中,有时候可能需要推迟一些高开销的对象初始化操作,并且只有在使用这些对象时才进行初始化 。这称为延迟初始化或懒加载
看一个不安全的延迟初始化:
A线程执行1后,发现对象instance为null,准备对其new,而B线程却先new了,这造成了错误
我们可以利用同步锁,保证正确:
但是对整个方法进行同步开销太大,人们想出了双重检查锁定:
最小范围所用同步锁,利用双重检查看似实现了目的,但这出现了一个问题:当A线程4执行时,线程B的7还未执行完成,而线程A判定instance != null. 线程B的7还未执行完成,为什么会出现这种情况?
看一下new Instance()的底层关键实现:
其实是先执行1分配内存,然后再初始化对象和设置instance.然后这里存在重排,2和3的顺序可能被调换:
所以当B还执行完7时,A在4判定instance对象已经完成初始化了,如果在ctorInstance(memory)之前去调用instance就会出错。
解决办法有两个:
1.将instance对象声明为volatile,它会禁止2,3的重排
2.利用基于类初始化的解决方案 :JVM在类的初始化阶段(即在Class被加载后,且被线程使用之前),会执行类的初始化。在
执行类的初始化期间,JVM会去获取一个锁。这个锁可以同步多个线程对同一个类的初始化
1.SpringMVC,Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架。2.Shiro,Apache Shiro是Java的一个安全框架。3.Mybatis,MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架。4.Dubbo,Dubbo是一个分布式服务框架。5.Maven,Maven是个项目管理和构建自动化工具。6.RabbitMQ,RabbitMQ是用Erlang实现的一个高并发高可靠AMQP消息队列服务器。7.Ehcache,EhCache 是一个纯Java的进程内缓存框架。
看完上述内容,你们对使用java怎么实现双重检查锁定有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注创新互联行业资讯频道,感谢大家的支持。
成都网站建设公司地址:成都市青羊区太升南路288号锦天国际A座10层 建设咨询028-86922220
成都快上网科技有限公司-四川网站建设设计公司 | 蜀ICP备19037934号 Copyright 2020,ALL Rights Reserved cdkjz.cn | 成都网站建设 | © Copyright 2020版权所有.
专家团队为您提供成都网站建设,成都网站设计,成都品牌网站设计,成都营销型网站制作等服务,成都建网站就找快上网! | 成都网站建设哪家好? | 网站建设地图