你的Java并发程序Bug,100%是这几个原因造成的
发布时间:2019-11-04 15:47:54 所属栏目:建站 来源:平头哥
导读:副标题#e# 可见性问题 可见性是指一个线程对共享变量进行了修改,其他线程能够立马看到该共享变量更新后的值,这视乎是一个合情合理的要求,但是在多线程的情况下,可能就要让你失望了,由于每个 CPU 都有自己的缓存,每个线程使用的可能是不同的 CPU ,这
有序性:程序执行的顺序按照代码的先后顺序执行,比如下面这段代码
按照有序性的话就需要按照代码的顺序执行下来,但是执行结果不一定是按照这个顺序来的,因为 JVM 为了提高程序的运行效率,会对上面的代码按照 JVM 编译器认为较好的顺序执行,从而可能打乱代码的执行顺序,是它会保证程序最终执行结果和代码顺序执行的结果是一致的,这也就是我们所说的指令重排序 由于指令重排序造成程序出 Bug 的典型案例就是:未加 volatile 关键字的双重检测锁单例模式,如下代码:
双重检测锁方案看上去非常完美,但是在实际运行时却会出 Bug,会出现对象逸出的问题,可能会得到一个未构建完的 Singleton 对象, 这个就是在构建 Singleton 对象时指令重排序的问题。我们先来看看构建对象理想型的操作指令:
(编辑:惠州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |