在JDK1.6以后,为了减少消耗,锁进行了很多的升级。并且有了四种状态,从低到高
下面就介绍一下这四种不同等级的锁
我的所有文章同步更新与Github-- Java-Notes ,想了解JVM(基本更完),HashMap源码分析,spring相关,,并发,剑指offer题解(Java版),可以点个star。可以看我的github主页,每天都在更新哟。
在讲锁之前我们应该了解对象的内存布局,因为后面锁的判定时需要用到,
该内容可以看我的这篇文章, 对象的内存布局 ,重点看对象头中的运行时数据(Mark Word)
看了这个你应该知道,Mark Word(以后简称MW) 会随着 标志位的变化而变化
可以看到,这种情况下,MW被分为了四个部分,他锁的标志位为 01,是否是偏向锁标志位为 0.
先看MW变化(在对象头变化的那一张图片中)
可以看到,他的 锁标志位 和 无锁 的标志位是一样的 都是 01,但是是否是偏向锁的标志位就变了 变成了 1.并且整个MW部分变成了5部分
经过研究发现, 大多数情况下 ,锁 不仅不存在 多线程竞争,而且总是由 同一线程 多次获得,为了 让线程获得锁 的 代价更低 而引人了偏向锁
偏向锁,就如同他的名字一样,"偏向","偏心",英文"biased"也是偏爱的意思。
他为啥是叫这个呢, 因为这个锁偏向于第一个获取到他的线程 ,如果在接下来的执行过程中,该锁 没有被其他的线程 获取,则持有偏向锁的线程将 永远不需要 再进行同步
上面一共被分为三大部分,
上面的图中,线程一演示了偏向锁的 初始化流程 ,线程2演示了偏向锁 撤销的过程
标志位为"00",可以看最开始的图
为啥叫轻量级锁,因为这是相比于传统的 重量级锁 而言,原来传统的重量级锁,使用的是 系统互斥量 实现的
他的出现并不是代替重量级锁, 而是在没有多线程竞争的前提下,减少系统互斥量操作产生的性能消耗
先看图
轻量级能提升程序同步性能的依据是"对于绝大部分的锁, 在整个同步周期内都是不存在竞争的 ",这是一个经验数据。