Java对象内存分布
1.6 synchronize 锁升级过程?和之前的版本有什么区别?是否可逆?
偏向锁,轻量级锁,重量级锁
synchronize 首先是无锁状态,当有竞争的时候,先检查Markword中的线程id 是否存储线程id, 没有的话就设置线程id,执行同步代码块,有的话cas操作,成功的话就执行同步代码块, 失败的话就进入到轻量级锁过程。
升级轻量级锁的时候 ,会发生 stop the word,然后将原先持有偏向锁的线程升级成轻量级锁,然后在 cas 操作,成功执行同步代码块,失败进行自旋,自旋达到一定次数之后还没有执行的话,就升级成重量级锁。
偏向锁:标志位 01 ,是否偏向锁 0 轻量级锁:标志位 01 ,是否偏向锁 1 重量级锁:标志位 10 ,是否偏向锁 0
区别:老版本直接实现的重量级锁,性能低。锁升级过程 利用了cas无锁编程,资源竞争不激烈的情况下,性能优,资源竞争激烈的情况下性能差,可以使用aqs 实现 lock。