synchronized面试题笔记

67 阅读1分钟

synchronized锁升级过程

1.检测Mark Word里面是不是当前线程的ID,如果是,表示当前线程处于偏向锁 2.如果不是,则使用CAS将当前线程的ID替换Mard Word,如果成功则表示当前线程获得偏向锁,置偏向标志位1 3.如果失败,则说明发生竞争,撤销偏向锁,进而升级为轻量级锁。 4.当前线程使用CAS将对象头的Mark Word替换为锁记录指针,如果成功,当前线程获得锁 5.如果失败,表示其他线程竞争锁,当前线程便尝试使用自旋来获取锁。 6.如果自旋成功则依然处于轻量级状态。 7.如果自旋失败,则升级为重量级锁。 8 采用的是自适应自旋锁来做的 1.8 默认自旋次数(-XX:PreBlockSpin)初始值是10 自旋次数最大值(-XX:MaxSpins)是0 1.8之前-XX:MaxSpin 参数控制的是自旋次数的最大值,它的默认值是 10

synchronized是可重入锁,那么它是如何实现可重入的呢?

偏向锁:检查markWord中的线程ID是否是当前线程,如果是的话就获取锁,继续执行代码; 轻量级锁:检查markWord中指向lockRecord的指针是否是指向当前线程的lockRecord,是的话继续执行代码; 重量级锁:检查_owner属性,如果该属性指向了本线程,_count属性+1,并继续执行代码。
参考www.bmabk.com/index.php/p…