Java对象内存分布


Java对象内存分布

1.6 synchronize 锁升级过程?和之前的版本有什么区别?是否可逆?

偏向锁,轻量级锁,重量级锁

synchronize 首先是无锁状态,当有竞争的时候,先检查Markword中的线程id 是否存储线程id, 没有的话就设置线程id,执行同步代码块,有的话cas操作,成功的话就执行同步代码块, 失败的话就进入到轻量级锁过程。

升级轻量级锁的时候 ,会发生 stop the word,然后将原先持有偏向锁的线程升级成轻量级锁,然后在 cas 操作,成功执行同步代码块,失败进行自旋,自旋达到一定次数之后还没有执行的话,就升级成重量级锁。

偏向锁:标志位 01 ,是否偏向锁 0 轻量级锁:标志位 01 ,是否偏向锁 1 重量级锁:标志位 10 ,是否偏向锁 0

区别:老版本直接实现的重量级锁,性能低。锁升级过程 利用了cas无锁编程,资源竞争不激烈的情况下,性能优,资源竞争激烈的情况下性能差,可以使用aqs 实现 lock。