面试复习 之 JDK1.6 锁优化

AbstractQueuedSynchronizer

#synchronized关键字实现同步的原理
监视器monitor
字节码:

  1. monitorenter
  2. monitorexit

https://blog.csdn.net/hqq2023623/article/details/51000153

JDK1.6 锁优化

https://juejin.im/post/5c3ac5386fb9a049e2323cf1

分成三部分:

  1. 锁升级(膨胀)
    1. 无锁状态
    2. 偏向锁
    3. 轻量级锁
    4. 重量级锁
  2. 锁消除
  3. 锁粗化

无锁状态、偏向锁、轻量级锁、重量级锁的 转换

https://blog.csdn.net/zhoufanyang_china/article/details/54601311
注意:偏向锁的撤销过程

偏向锁的升级
当线程1访问代码块并获取锁对象时,会在java对象头和栈帧中记录偏向的锁的threadID,因为偏向锁不会主动释放锁,因此以后线程1再次获取锁的时候,需要比较当前线程的threadID和Java对象头中的threadID是否一致,如果一致(还是线程1获取锁对象),则无需使用CAS来加锁、解锁;如果不一致(其他线程,如线程2要竞争锁对象,而偏向锁不会主动释放因此还是存储的线程1的threadID),那么需要查看Java对象头中记录的线程1是否存活,如果没有存活,那么锁对象被重置为无锁状态,其它线程(线程2)可以竞争将其设置为偏向锁;如果存活,那么立刻查找该线程(线程1)的栈帧信息,如果还是需要继续持有这个锁对象,那么暂停当前线程1,撤销偏向锁,升级为轻量级锁,如果线程1 不再使用该锁对象,那么将锁对象状态设为无锁状态,重新偏向新的线程。

https://www.cnblogs.com/wade-luffy/p/5969418.html
https://blog.csdn.net/tongdanping/article/details/79647337

java 对象头 锁是如何表示的 JVM内存结构

https://www.cnblogs.com/wade-luffy/p/5969418.html

你可能感兴趣的:(多线程,面试,AQS,同步器,JDK1.6锁优化)