偏向锁流程的问题

Java中偏向锁的问题:当线程1获得偏向锁后,线程2尝试进入同步代码块前,发现现在有锁,是偏向锁,但是Mark Word中的ThreadId不指向自己,会做什么?
看资料,线程2会用CAS将ThreadId指向自己。
线程2更改ThreadId时,CAS的内存预期值是什么呢?
感觉这块如果没有除线程1以外的竞争者,线程2肯定能改变成功,然后进入代码块,线程1和线程2就同时执行了,说不通啊
求大神指导

阅读 1.3k
1 个回答

synchronized的锁升级过程,我感觉和JDK的AbstractQueuedSynchronizer相似,一个是内置的,一个是JDK源码的,我们可以看的。在AbstractQueuedSynchronizer中,有个状态值state,来表示当前锁是否被占有,如果线程1占用了锁,线程2进来的时候,会CAS判断一下是否能获取锁,这个内存预期值就是state的值,0表示无线程占用。在synchronized中,也是有对象头来记录锁信息的

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题