读《深入理解Java虚拟机》- 笔记08

96
阿历Ali
2018.08.18 19:25 字数 1233

《深入理解Java虚拟机:JVM高级特性与最佳实践》第2版

第10章 早期(编译期)优化

59. 语法糖

在计算机语言中添加某种语法,对语言的功能没有影响,但是方便开发人员使用。

泛型是一种语法糖

60. 自动拆箱

== 在没有算数运算时不会自动拆箱;

equals 方法不处理数据类型转换。

第11章 晚期(运行期)优化

61. 即时编译器编译热点代码

热点代码:1)被多次调用的方法;2)被多次执行的循环体

为了提高热点代码的运行效率,即使编译器将其编译为本地平台机器码,并进行优化。

62. 多态与运行期编译

只有使用 invokspecial 指令调用的私有方法、实例构造器、父类方法以及使用 invokestatic 指令进行调用的静态方法是在编译器解析的,其他方法在运行期编译。

63. 栈上分配

如果能确定对象只在方法内引用,那么就可以为对象分配栈空间,随着方法结束而销毁,减少垃圾回收的压力。

第12章 Java 内存模型与线程

64. 硬件效率与一致性

为了使处理器内部运算单元尽量被充分利用,处理器会对代码乱序优化,再将结果重组。这样不能保证代码顺序执行,但是能保证执行结果与顺序执行是一致的。

65. Java 内存模型

JVM 定义 Java 内存模型,屏蔽硬件和操作系统的内存访问差异。(Java 跨平台的又一原因)

不同机器的物理硬件和内存模型不同。如果依赖本地系统,可能导致同一个程序在不同平台执行结果不同。

66. volatile 变量的作用与局限

volatile 变量每次使用前都从主存刷新。但是 java 运算不一定是原子操作,导致volatile 运算不一定并发安全。

volatile的另一作用是禁止指令重排序

67. 先行发生原则

时间先后顺序与先行发生原则之间基本没有太大关系,所以衡量并发安全问题时不要时间顺序干扰,应以先行发生原则为准。

68. java 线程状态

新建、运行、无限期等待、限期等待、阻塞

在操作系统中,线程的状态有:新建、就绪、运行、阻塞、死亡

第13章 线程安全与锁优化

69. 互斥是保证同步的一种手段

最基本的互斥同步手段是 synchronized 关键字,经过编译后会在同步块前后使用 monitorenter 和 monitorexit 两个字节码指令。

如果指定了锁定和解锁对象,那么就使用这个对象加锁;如果没有指定,实例方法用对应实例加锁,类方法用对应的 Class 对象加锁。

70. Atomic 类使用乐观锁

乐观锁调用 CAS 指令。CAS 的漏洞是 ABA 问题,简单说是认为 A 改为 B 再改为 A,程序认为 A 没有变过。

AtomicStampedReference 类可以通过控制变量值的版本以保证 CAS 的正确性。

71. 自旋锁与自适应自旋

互斥同步对性能最大的影响是实现阻塞,挂起线程和恢复线程需要转入内核态完成,给系统的并发性带来很大的压力。

自旋锁:让后面请求锁的线程不放弃处理器执行时间,看看持有锁的线程是否很快会释放锁。实现等待的方法是让线程执行一个忙循环(自旋)。

自适应自旋:如果线程自旋成功过,则认为成功获得锁的几率大,那么增加等待时间,否则省略自旋。

其他锁优化的技术:锁消除、锁粗化、轻量级锁(CAS 操作)、偏向锁。

- 完 -

读《深入理解Java虚拟机》- 笔记01

读《深入理解Java虚拟机》- 笔记02

读《深入理解Java虚拟机》- 笔记03

读《深入理解Java虚拟机》- 笔记04

读《深入理解Java虚拟机》- 笔记05

读《深入理解Java虚拟机》- 笔记06

读《深入理解Java虚拟机》- 笔记07

至此笔者读此书的主要笔记已经集结完成。当然还有很多不懂,不透彻的知识点,望常读常新,在自悟与切磋中顿悟。

技术
Web note ad 1