《深入理解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 操作)、偏向锁。
- 完 -
至此笔者读此书的主要笔记已经集结完成。当然还有很多不懂,不透彻的知识点,望常读常新,在自悟与切磋中顿悟。
网友评论