在JDK1.6开始,对象实例在堆中会被划分三个组成部分:对象头,实例数据,和对其填充。
我们在锁升级的过程中只需要关注Mark World(它记录了对象,锁和垃圾回收相关的信息,在64位JVM中其长度为64bit)的位信息包括了如下组成信息:
- 无锁标记: 当前对象没有上锁。
1. 偏向锁标记:
2. 轻量级锁标记:
3. 重量级锁标记:直接从用户态切换到内核态。
4. GC标记: 判断对象是否可被垃圾收回收掉。
总体而言如下图所示:
在偏向锁的应用场景主要集中在竞争不激烈的情况下,通过使用偏向锁可以减少其在CAS操作下的同步性能消耗,从而获取性能的提升。
若一个线程已经获取到了当前对象的锁,这时第二个线程又开始尝试争抢该对象的锁,由于该对象已经被第一次线程获取到了,因此它是偏向锁,而第二个线程在争抢时,发现对象头的Mark World已经是偏向锁,但里面存储的线程Id并不是自己(是第一个线程),那么它会进行CAS,来竞争锁,这里存在两种情况:
## 各自的优缺点
原文:https://www.cnblogs.com/karlMa/p/12287081.html