分享

多线程编程中什么情况下需要加volatile呢?

 昵称11935121 2018-03-15

先说一下在JDK1.2之前的,那个Java的内存模型实现总是从主存(即共享内存)读取变量,是不需要进行特别的注意的。而随着JVM的成熟和优化,那么现在在多线程环境下volatile关键字的使用也变得非常重要的的,所以经常使用。

欢迎加入我的技术交流群:587069240(只限于编程技术交流的人群加入!!!)

现在一般说来,多任务多线程的环境下的,各任务间共享的变量都应该加volatile修饰符的。

可见性的过程:

这个Volatile修饰的成员变量在每次被线程访问时的,都都强迫从共享内存中重读该成员变量的值。而且得,当成员变量发生变化时,强迫线程将变化值回写到共享内 存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值的的,就是保持可见性

可以禁止指令重排介绍:

这个指令重排序是JVM为了优化指令、提高程序运行效率,在不影响单线程程序执行结果的前提下,尽可能地提高并行度的。

指令重排序包括编译器重排序和运行时重排序。

在JDK1.5之后,可以使用volatile变量禁止指令重排序

那么针对volatile修饰的变量,在读写操作指令前后会插入内存屏障,指令重排序时不能把后面的指令重排序到内存屏障后面的。

这个JVM内存屏障插入的策略的:

这个每个volatile写操作的前面插入一个StoreStore屏障的;

可以在每个volatile写操作的后面插入一个StoreLoad屏障; 在每个volatile读操作的后面插入一个LoadLoad屏障; 在每个volatile读操作的后面插入一个LoadStore屏障的。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多