偏向锁
在写这篇文章的时候我也纠结了好一会,因为偏向锁在java 9中已经被移除掉了.根据作者的解释原因有二:一是硬件的升级提升了CAS原子指令的性能,二是因为偏向锁的实现有点太复杂了. 简单来说就是随着硬件的升级,偏向锁带来的优势已经不存在了,而且它的实现也比较复杂,所以干脆就去掉了. 这是作者的原文:blogs.oracle.com/dave/biased….
这里也建议英语好的读者多看看 Dave Dice,Doug Lea的博客,他们就是编写jdk源码的大神,他们写出的文章那绝对是第一手资料,对于重点和难点都会有及时和权威的解释.
所以是否值得把花时间在一个即将过时的技术点上请读者自行斟酌. 不过从面试的角度来说还是了解一下为好,因为当面试官让你解释锁升级过程时,你不能直接说偏向锁已经过时了,我不太清楚.毕竟还是有好多应用跑在jdk1.8上的. 所以这篇文章我尽量做到点到为止,好让大家把更多精力放到主流技术上.
上一节我们说到当对象刚被初始化的时候,通过观察mark word发现它是无锁状态. 当只有一个线程试图获取这把锁时, 其实是不存在竞争的,它可以直接获取.哪具体如何获取呢?
获取过程
- 偏向锁本身也是使用CAS来获取,因为此时只有一个线程参与竞争,所以必定由该线程获取.
- 获取成功后将线程ID更新到对象的
mark word中.便于同一个线程的重入
偏向锁不会被主动释放, 当存在不同线程竞争时,会先将持有偏向锁的线程挂起,此时准备升级为轻量级锁.偏向锁的本质就是便于重入,支持重入也就避免了再次执行CAS,而上面也提到了随着硬件升级CAS的延迟也降低了,所以干脆就设置为deprecated了.