这个我们要分情况来分析:
1,JDK1.6之前
synchronized是由一对monitor-enter和monitor-exit指令实现的。
这对指令的实现是依靠操作系统内部的互斥锁来实现的,期间会涉及到用户态到内存态的切换,所以这个操作是一个重量级的操作,性能较低。
2,JDK1.6之后
JVM对synchronized进行了优化,改了三个经历的过程
偏向锁->轻量级锁->重量级锁
偏向锁:
在锁对象保存一个thread-id字段,刚开始初始化为空,当第一次线程访问时,则将thread-id设置为当前线程id,此时,我们称为持有偏向锁。
当再次进入时,就会判断当前线程id与thread-id是否一致
如果一致,则直接使用此对象
如果不一致,则升级为轻量级锁,通过自旋锁循环一定次数来获取锁
如果执行了一定次数之后,还是没能获取锁,则会升级为重量级锁。
锁升级是为了降低性能的消耗。