final的作用从两个方面理解:基本的锁定功能,帮助JVM实现效率和安全。关于final的解释非常多,本文仅做整理的总结。

基本用法:锁定

final的锁定功能通过final修饰的对象来具体实现,final可以修饰class类/field字段/method方法,被final修饰的不同对象笼统的均处于各自不能再进行修改的状态。此类用法比较简单,知识点梳理请参考下图。

同时,不清楚的内容可以直接参考www.geeksforgeeks.org/final-keywo… 进行深入学习。

高级用法:效率与安全

1) 效率方面方面

final为JIT提供了便利,增加了JIT对代码进行内联的可行性。可参考《java编程思想》中对final提高效率的解释。

2)多线程安全方面

编译器和处理器均会对运行指令进行适当的重排序增进效率,JSR-133针对虚拟机的reordering进行了清晰地规定,其中被final修饰的字段的读load和写store指令的重排序均受到了限制:

(参考:JSR-133, www.infoq.cn/article/jav… )

同时注意,最常见的X86的处理器并不会对loadload和storestore进行重排序。本文重点讲一下final对构造器storestore的重排序的限制。

  • 原理:处理器无法重排序的原因是编译器会在 final 域的写之后,插入一个 StoreStore 屏障,这个屏障禁止处理器把 final 域的写重排序到之后的store语句;
  • 举例说明(参考代码块):假设有两条语句final字段的赋值(x.finalField = v; ) ,其后跟随一条赋值语句将finalField的holding对象赋值给其他线程可见的对象Y (sharedY = x;);这两条语句是不可以重排序的;
  • 常常出现的场景是构造方法时new的过程被重排序,导致字段在没有赋值时被使用;此时final,volatile等阻止重排序的字段均可以保证对象安全;
class MyClass {int i;    // 非final语句MyClass () {i = 1;}
}Thread 1:MyClass clazz = new MyClass();  // clazz是共享变量
Thread 2:  if (clazz != null) {  System.out.println(clazz.i);}将new分为三步:
1. 分配内存空间给var
2. 初始化var (var.i = 1)
3. class = var在没有i final情况下,2和3的顺序可能被重排序,导致thread2在发现clazz非空时,无法获得正确的var.i复制代码

转载于:https://juejin.im/post/5cea0e77f265da1b8811b8bd

java夯实基础:final脑图相关推荐

  1. Elasticsearch基础整理 脑图

    Elasticsearch知识整理,基于ES6.7.1 主要涉及ES集群各模块功能及使用说明,集群选举流程 读取/写入流程等等,不涉及dsl等具体操作,后面会持续更新! 需要完整文件 到我 公众号 ' ...

  2. 【一】Java语言基础思维导图

    知识章节参考:[一]Java语言基础

  3. 【面向对象篇】Java必备基础(思维导图+代码)

    文章目录 类和对象 定义 类的关键字 访问修饰符 成员变量与成员函数 package.import 静态域与静态方法 隐式参数和显式参数 继承(extends) 继承关键字 final关键字 supe ...

  4. 【基础语法篇】Java必备基础(思维导图+代码)

    文章目录 基本语法 初识JDK 输入与输出 条件与循环 一维数组与二维数组 函数及其他补充 Java常用类 Number&Math类 Arrays类 String类 关于==和equals 其 ...

  5. java夯实基础系列:反射

    一.反射定义&通俗理解   反射之中包含了一个"反"的概念,所以要想解释反射就必须先从"正"开始解释,一般而言,当用户使用一个类的时候,应该先知道这个类 ...

  6. java夯实基础-基本数据类型

    学习任何一门语言,基础永远都是最重要的.本文测试java中八种基本数据类型(int,short,long,float,double,char,boolean,byte),包括其占用空间大小,能够存储的 ...

  7. java夯实基础-关键字

    本文总结了java中51个关键字,分别对他们的含义.作用有一定说明. 1.访问权限 public    共有权限       可跨包访问 protected   保护权限      同一包可访问:不同 ...

  8. java 夯实基础_夯实基础-java equals使用,和 == 的区别

    在研究hashcode的用法,发现自己对equals的理解还不够深,废话少说,继续专研,记录如下: 要想搞清楚equals和==的区别,就先要搞清楚JAVA的数据类型: java的数据类型只要分两大类 ...

  9. java夯实基础-输入输出流

    本文测试java中的字节流.字符流.缓冲流.随机流.文件锁. 一.字符流:Reader和Writer package com.wllfengshu.test;import java.io.File; ...

最新文章

  1. easyui日期处理(开始时间和结束时间)
  2. 黑色星期五c语言,求黑色星期五问题~
  3. linux kernel 内存管理 感想总结(未完待续)
  4. C++获取当前时间和计算程序运行时间的方法
  5. 剑指Offer #03 从尾到头打印链表(递归)
  6. Delphi中判断字母与汉字
  7. Windows 程序设计技巧
  8. 光伏等新能源信用风险事件频繁爆发
  9. NGenerics算法库是学习的好代码
  10. 问题 A: 阿正的忐忑不安(C语言)
  11. [转载] 华中科技大学期刊分类办法
  12. mysql数据完整性约束包括_MYSQL回顾(完整性约束相关)
  13. php蓝奏云解析源码,PHP获取蓝奏云直链解析源码
  14. 文本文件上传漏洞[任意.绕过.解析]
  15. Emacs Lisp程序单步调试
  16. ZZULIOJ1071-1075Python解法
  17. Android 热修复框架: Sophix基本使用
  18. html 输出helloworld,以及基本结构详解
  19. 打飞机小游戏html代码,纯汇编实现打飞机小游戏的示例代码
  20. 纷享销客产品副总裁李杰:连接型CRM如何支撑快消品牌企业新增长

热门文章

  1. const reference const
  2. python 打包wheel文件,自己的SDK包
  3. 多目标检测跟踪文献代码汇总
  4. ubuntu安装KVM
  5. Hadoop配置环境变量
  6. leetcode每日一题系列——797. 所有可能的路径
  7. 小鱼天气android,小鱼天气(cn.microsoft.cig.uair) - 1.3.14 - 应用 - 酷安
  8. c语言数码管数字时钟程序,数码管显示模拟8位时钟C语言程序设计
  9. react 合并数组_React 数组合并去重,实现请求三遍返回三组数据的合并去重。
  10. Linux750 权限,linux系统文件权限简明介绍