84-说说synchronized底层原理(重要)

这个我们要分情况来分析:

1,JDK1.6之前

synchronized是由一对monitor-enter和monitor-exit指令实现的。

这对指令的实现是依靠操作系统内部的互斥锁来实现的,期间会涉及到用户态到内存态的切换,所以这个操作是一个重量级的操作,性能较低。

2,JDK1.6之后

JVM对synchronized进行了优化,改了三个经历的过程

偏向锁->轻量级锁->重量级锁

偏向锁

在锁对象保存一个thread-id字段,刚开始初始化为空,当第一次线程访问时,则将thread-id设置为当前线程id,此时,我们称为持有偏向锁。

当再次进入时,就会判断当前线程id与thread-id是否一致

如果一致,则直接使用此对象

如果不一致,则升级为轻量级锁,通过自旋锁循环一定次数来获取锁

如果执行了一定次数之后,还是没能获取锁,则会升级为重量级锁

锁升级是为了降低性能的消耗。