java双重检查锁定的实现代码

 更新时间:2018年06月19日 16:28:55   投稿:mrr  
这篇文章主要介绍了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会去获取一个锁。这个锁可以同步多个线程对同一个类的初始化

  我们会发现基于类初始化的方案的实现代码更简洁。但基于volatile的双重检查锁定的方案有一个额外的优势:除了可以对静态字段实现延迟初始化外,还可以对实例字段实现延迟初始化。字段延迟初始化降低了初始化类或创建实例的开 销,但增加了访问被延迟初始化的字段的开销。在大多数时候,正常的初始化要优于延迟初始化。如果确实需要对实例字段使用线程安全的延迟初始化,请使用上面介绍的基于volatile的延迟初始化的方案;如果确实需要对静态字段使用线程安全的延迟初始化,请使用上面介绍的基于类初始化的方案。

总结

以上所述是小编给大家介绍的java双重检查锁定的实现代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • SpringBoot集成Jpa对数据进行排序、分页、条件查询和过滤操作

    SpringBoot集成Jpa对数据进行排序、分页、条件查询和过滤操作

    这篇文章主要介绍了SpringBoot集成Jpa对数据进行排序、分页、条件查询和过滤操作,主要使用Jpa连接数据库对数据进行排序、分页、条件查询和过滤操作,需要的朋友可以参考下
    2023-05-05
  • java 中复合机制的实例详解

    java 中复合机制的实例详解

    这篇文章主要介绍了java 中复合机制的实例详解的相关资料,希望通过本文大家能了解继承和复合的区别并应用复合这种机制,需要的朋友可以参考下
    2017-09-09
  • java获取微信accessToken的方法

    java获取微信accessToken的方法

    这篇文章主要为大家详细介绍了java获取微信accessToken的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-09-09
  • 利用Spring框架为自己的校园卡充值(推荐)

    利用Spring框架为自己的校园卡充值(推荐)

    这篇文章主要介绍了利用Spring框架为自己的校园卡充值,本次实验主要运用了Spring的控制反转(IOC)和依赖注入(DI)等知识,通过利用Spring框架编写Java程序,实现学生卡的单次充值,如需对学生卡进行多次充值,可将部分代码修改即可实现,需要的朋友可以参考下
    2022-10-10
  • 25个最好的免费Eclipse插件

    25个最好的免费Eclipse插件

    这篇文章为大家分享了25个让Java程序员更高效的Eclipse插件,感兴趣的朋友可以参考一下
    2015-12-12
  • java中Arrays.sort()排序方法举例详解

    java中Arrays.sort()排序方法举例详解

    这篇文章主要给大家介绍了关于java中Arrays.sort()排序方法举例详解的相关资料,Java Arrays.sort()方法对数组进行排序,通常情况下直接传入数组,默认升序排序,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-11-11
  • java中Class类的基础知识点及实例

    java中Class类的基础知识点及实例

    在本篇文章里小编给大家分享了关于java中Class类的基础知识点及实例内容,有兴趣的朋友们可以学习下。
    2021-05-05
  • Springboot转发重定向实现方式解析

    Springboot转发重定向实现方式解析

    这篇文章主要介绍了springboot转发重定向实现方式解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • SpringCloud Config连接git与数据库流程分析讲解

    SpringCloud Config连接git与数据库流程分析讲解

    springcloud config是一个解决分布式系统的配置管理方案。它包含了 client和server两个部分,server端提供配置文件的存储、以接口的形式将配置文件的内容提供出去,client端通过接口获取数据、并依据此数据初始化自己的应用
    2022-12-12
  • Spring MVC 拦截器实现登录

    Spring MVC 拦截器实现登录

    这篇文章主要介绍了Spring MVC 拦截器实现登录,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07

最新评论