理论知识
看了一篇博客(https://blog.csdn.net/weixin_45007916/article/details/107535746),其中有以下的图片:
偏向锁未启动时,markword的最后3个bit是001
匿名偏向时,markword的最后3个bit是101
jdk8默认的偏向锁启动延迟是4s(BiasedLockingStartupDelay=4000)
PS C:\Java_Study\wsc_shell> java -XX:+PrintFlagsFinal -version|findstr /i bias
java version "1.8.0_221"
Java(TM) SE Runtime Environment (build 1.8.0_221-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.221-b11, mixed mode)
intx BiasedLockingBulkRebiasThreshold = 20 {product}
intx BiasedLockingBulkRevokeThreshold = 40 {product}
intx BiasedLockingDecayTime = 25000 {product}
intx BiasedLockingStartupDelay = 4000 {product}
bool TraceBiasedLocking = false {product}
bool UseBiasedLocking = true {product}
bool UseOptoBiasInlining = true {C2 product}
实验环境
windows10 x64
C:\Program Files\Java\jdk1.8.0_221\bin\java.exe
偏向锁未启动
对象头的最后1个byte是00000001,最后3个bit是001,
匿名偏向
延迟4100ms让偏向锁启动之后,再打印对象obj的信息内存结构信息
对象头的最后1个byte是00000101,最后3个bit是101,但是对象头中并未看到指向当前线程的指针
偏向锁中当前线程指针不为空
此时的偏向锁指向当前线程的数据(对象头低54个bit)为,00000000 00000000 00000000 00000000 00000011 01010110 011010
Epoch为00
hex(int(‘000000000000000000000000000000000000001101010110011010’, 2))
0xd59a
0xd59a这个和当前线程怎么联系起来?
计算对象的hashcode会使得偏向锁失效-匿名偏向到无锁
对象头的最后1个byte是00111000,最后3个bit是001,
从对象头的第26个bit开始的31bit是hashcode值,即
0011110 11110111 11111110 10001110
计算 int(‘0011110111101111111111010001110’, 2)
519569038
和输出的obj.hashCode()一致
计算对象的hashcode会使得偏向锁失效-升级为轻量级锁
对象头的最后1个byte是01011000,最后3个bit是000,
对象头的前62个bit是00000011 00110000 11110110 010110
hex(int(‘000000110011000011110110010110’, 2))
‘0xcc3d96’
0xcc3d96和当前线程栈中的Lock Record怎么联系起来?