zoukankan      html  css  js  c++  java
  • 关于java的volatile

    记得早前本人写过一篇关于C关键字volatile一点认知文章

    由于最近因业务需要一直在做与java相关的开发。故研究了一下java里的volatile这里与C里的大致相同(注:以下如未特殊说明所有volatile都指java里为主)。

    java的内存交互用java的指令分为:lock、unlock、read、load、use、assign、store、write这8种。

    其中lock、unlock是同步锁所产生的(如:synchronized、com.util.concurrent中的原子类)。

    默认java会开启优化模式,也就是说后6种操作(read、load、use、assign、store、write)都可能是无序的。

    好了,java内存加载大致就是这样。

    volatile的作用就是【read、load、use】与【assign、store、write】这每组里面的操作都是有序的。也就是说不要让java优化。

    网上也说了很多volatile为啥不是线程安全的,其实说白了上面的二元组中间可以插入其它操作,如:

    public class VolatileTest {
        public static volatile int race = 0;
    
        public static void raceIncr() {
            race++;
        }
    }

    这里如果调用receIncr方法会大致执行以下操作:

    read、load、use、iconst_1、iadd、assign、store、write

    那么这里iconst_1、iadd对其它线程来说并不是可见的。。。

    故总结,常用还是赋值吧。。

  • 相关阅读:
    怎么重新启动网卡
    @JsonProperty的使用
    JAVA中的反射机制
    spring的IOC入门案例
    spring的IOC底层原理
    maven+Spring环境搭建
    SpringMVC与Struts2区别与比较总结
    Struts2面试题
    oracle自增序列创建
    Hibernate分页查询报错
  • 原文地址:https://www.cnblogs.com/tywei/p/7552783.html
Copyright © 2011-2022 走看看