Java 锁优化
20 Oct 2020JDK6 之前大家对 synchronized 的印象就是慢,所以 JDK6 对 synchronized 做了大量的优化。主要有:
- 自旋锁 Spinlock
- 适应性自旋 Adaptive Spinning
- 锁消除 Lock Elimination
- 锁粗化 Lock Coarsening
- 偏向锁 Biased Locking
- 轻量级锁 Lightweight Locking
- …
自旋锁以及它的进阶版适应性自旋优化针对的场景是,大部分时候线程持锁的时间是比较短暂的,我们没必要让线程使用重量级的系统调用来等待唤醒,可以增加一些空循环,说不定就能获取到锁了。普通自旋锁这个空循环的次数是固定的,适应性自旋会根据运行时的信息,来动态调整空循环的次数。
锁消除与锁粗化比较简单,就是有时候一个对象根本不会被并发使用,所以完全没必要去做加锁的操作,或者对于一个锁连续的加锁解锁可以合并成一次加锁解锁。
偏向锁针对的场景是,大部分第三方库是针对并发场景开发的,但是很可能在实际使用的时候并不会有并发发生,所以对于这种场景,一旦一个线程获取了这个锁,下次使用的时候就不用去执行昂贵的加锁操作了。
轻量级锁与偏向锁类似,它针对的场景是,虽然程序会有并发,但是大部分时候并不会触发竞争,所以可以用一些轻量级的方式来代替重量级的系统实现。
对于偏向锁与轻量级锁他们只是假设了某种场景,但是实际中可能这个假设是错误的,也就是说发生了竞争,那么这些锁就需要升级,偏向锁升级为轻量级锁,轻量级锁升级为重量级锁,升级的具体过程就要去看源码了,就不展开了。
锁这个词即是名词又是动词,我的理解是当强调锁的作用时应该用名词的锁 (Lock),强调锁的方式时用动词的锁 (Locking)。不过很多时候在英文里,Lock 与 Locking 各种混用。
https://github.com/farmerjohngit/myblog/issues/12 https://m.douban.com/book/subject/34907497/