java夯实基础:final脑图
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脑图相关推荐
- Elasticsearch基础整理 脑图
Elasticsearch知识整理,基于ES6.7.1 主要涉及ES集群各模块功能及使用说明,集群选举流程 读取/写入流程等等,不涉及dsl等具体操作,后面会持续更新! 需要完整文件 到我 公众号 ' ...
- 【一】Java语言基础思维导图
知识章节参考:[一]Java语言基础
- 【面向对象篇】Java必备基础(思维导图+代码)
文章目录 类和对象 定义 类的关键字 访问修饰符 成员变量与成员函数 package.import 静态域与静态方法 隐式参数和显式参数 继承(extends) 继承关键字 final关键字 supe ...
- 【基础语法篇】Java必备基础(思维导图+代码)
文章目录 基本语法 初识JDK 输入与输出 条件与循环 一维数组与二维数组 函数及其他补充 Java常用类 Number&Math类 Arrays类 String类 关于==和equals 其 ...
- java夯实基础系列:反射
一.反射定义&通俗理解 反射之中包含了一个"反"的概念,所以要想解释反射就必须先从"正"开始解释,一般而言,当用户使用一个类的时候,应该先知道这个类 ...
- java夯实基础-基本数据类型
学习任何一门语言,基础永远都是最重要的.本文测试java中八种基本数据类型(int,short,long,float,double,char,boolean,byte),包括其占用空间大小,能够存储的 ...
- java夯实基础-关键字
本文总结了java中51个关键字,分别对他们的含义.作用有一定说明. 1.访问权限 public 共有权限 可跨包访问 protected 保护权限 同一包可访问:不同 ...
- java 夯实基础_夯实基础-java equals使用,和 == 的区别
在研究hashcode的用法,发现自己对equals的理解还不够深,废话少说,继续专研,记录如下: 要想搞清楚equals和==的区别,就先要搞清楚JAVA的数据类型: java的数据类型只要分两大类 ...
- java夯实基础-输入输出流
本文测试java中的字节流.字符流.缓冲流.随机流.文件锁. 一.字符流:Reader和Writer package com.wllfengshu.test;import java.io.File; ...
最新文章
- easyui日期处理(开始时间和结束时间)
- 黑色星期五c语言,求黑色星期五问题~
- linux kernel 内存管理 感想总结(未完待续)
- C++获取当前时间和计算程序运行时间的方法
- 剑指Offer #03 从尾到头打印链表(递归)
- Delphi中判断字母与汉字
- Windows 程序设计技巧
- 光伏等新能源信用风险事件频繁爆发
- NGenerics算法库是学习的好代码
- 问题 A: 阿正的忐忑不安(C语言)
- [转载] 华中科技大学期刊分类办法
- mysql数据完整性约束包括_MYSQL回顾(完整性约束相关)
- php蓝奏云解析源码,PHP获取蓝奏云直链解析源码
- 文本文件上传漏洞[任意.绕过.解析]
- Emacs Lisp程序单步调试
- ZZULIOJ1071-1075Python解法
- Android 热修复框架: Sophix基本使用
- html 输出helloworld,以及基本结构详解
- 打飞机小游戏html代码,纯汇编实现打飞机小游戏的示例代码
- 纷享销客产品副总裁李杰:连接型CRM如何支撑快消品牌企业新增长
热门文章
- const reference const
- python 打包wheel文件,自己的SDK包
- 多目标检测跟踪文献代码汇总
- ubuntu安装KVM
- Hadoop配置环境变量
- leetcode每日一题系列——797. 所有可能的路径
- 小鱼天气android,小鱼天气(cn.microsoft.cig.uair) - 1.3.14 - 应用 - 酷安
- c语言数码管数字时钟程序,数码管显示模拟8位时钟C语言程序设计
- react 合并数组_React 数组合并去重,实现请求三遍返回三组数据的合并去重。
- Linux750 权限,linux系统文件权限简明介绍