• 技术文章 >java >java基础

    java中final域的内存语义理解

    小妮浅浅小妮浅浅2021-08-04 10:24:36原创4287

    说明

    1、对于final域的内存语义,编译器和处理器要遵守两个重排序规则(内部实现也是使用内存屏障):

    2、写final域的重排序规则:在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。

    读final域的重排序规则:初次读一个包含final域的对象的引用,与随后初次读这个final域,这两个操作之间不能重排序。

    实例

    public class FinalExample {
           int i;//普通域
           final int j;//final域
           static FinalExample obj;
           
           public FinalExample () {
                  i = 1;//写普通域。对普通域的写操作【可能会】被重排序到构造函数之外
                  j = 2;//写final域。对final域的写操作【不会】被重排序到构造函数之外
           }
           
           // 写线程A执行
           public static void writer () {    
                  obj = new FinalExample ();
           }
           
           // 读线程B执行
           public static void reader () {    
                  FinalExample object = obj;//读对象引用
                  int a = object.i;//读普通域。可能会看到结果为0(由于i=1可能被重排序到构造函数外,此时y还没有被初始化)
                  int b = object.j;//读final域。保证能够看到结果为2
           }
    }

    以上就是java中final域的内存语义理解,希望对大家有所帮助。更多Java学习指路:Java基础

    本教程操作环境:windows7系统、java10版,DELL G3电脑。

    专题推荐:java final
    上一篇:java内存间交互规则 下一篇:java枚举如何实现单例

    相关文章推荐

    • java静态方法和非静态方法的介绍• java io和nio的区别• java进程和线程的关系• Java守护线程和用户线程的区别• Java Executors中的四种线程池• Java runnable和callable的异同• java sleep()和wait()的区别• Java用户线程是什么• java守护线程的注意事项

    全部评论我要评论

    © 2021 Python学习网 苏ICP备2021003149号-1

  • 取消发布评论
  • 

    Python学习网