加入收藏 | 设为首页 | 会员中心 | 我要投稿 惠州站长网 (https://www.0752zz.com.cn/)- 办公协同、云通信、物联设备、操作系统、高性能计算!
当前位置: 首页 > 建站 > 正文

你的Java并发程序Bug,100%是这几个原因造成的

发布时间:2019-11-04 15:47:54 所属栏目:建站 来源:平头哥
导读:副标题#e# 可见性问题 可见性是指一个线程对共享变量进行了修改,其他线程能够立马看到该共享变量更新后的值,这视乎是一个合情合理的要求,但是在多线程的情况下,可能就要让你失望了,由于每个 CPU 都有自己的缓存,每个线程使用的可能是不同的 CPU ,这

但是实际在 JVM 编译器上可能不是这样,可能会被优化成如下指令:

  • 指令1:分配一块内存 M;
  • 指令2:将 M 的地址赋值给 instance 变量;
  • 指令3:最后在内存 M 上初始化 Singleton 对象。

看上去一个小小的优化,也就是这么一个小小的优化就会使你的程序不安全,假设抢到锁的线程执行完指令2 之后,此时的 instance 已经不为空了,这时候来了线程C,线程C 看到的 instance 已经是不为空的了,就会直接返回 instance 对象,这时候的 instance 并未初始化成功,调用 instance 对象的方法或者成员变量时将有可能触发空指针异常。可能的执行流程图:

你的Java并发程序Bug,100%是这几个原因造成的

未加 volatile 关键字的双重检测锁单例模式

上面就是造成 Java 程序在多线程情况下出 Bug 的三种原因,关于这些问题 JDK 公司也给出了相应的解决办法,具体如下图所示,这些解决办法的更多细节,我们后面在细细道来。

你的Java并发程序Bug,100%是这几个原因造成的

并发解决机制

(编辑:惠州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读