synchronized的底层的实现
轻量级锁
synchronized会优先使用CAS的轻量级锁
CAS(compare and swap)比较并交换,可以解决多线程并行情况下使用锁造成性能损耗的一种机制。在JVM直接解决,while循环
保证原子性的操作是
AtomicInteger类中->unsafe->之后到cpp的代码中
cas是一种乐观锁的思想,而且是一种非阻塞的轻量级的乐观锁,非阻塞式是指一个线程的失败或者挂起不应该影响其他线程的失败或挂起的算法。
sync
轻量级锁
lock cmpxchg 指令
解决ABA问题:
1、加版本号
2、AtomicStampedReference
重量级锁
交给操作系统来处理
轻量级锁一定比重量级锁好吗?
在CAS的时候会一直使用while的,会消耗cpu的资源,这时候需要就重量级锁可能会更好一点
轻量级锁怎么升级会重量级锁?
调用wait(),jdk前几个版本是jvm调优,就是循环多少次就会进入重量级锁。现在改成了自适应,你不用管他,重度竞争就会到重量级锁
偏向锁
第一个来的有偏向锁
markword中,第一个为101的时候就会变成偏向锁,加锁后,后面24位会改变,前8位不会改变
假如是正常的加锁,都会改变
默认情况下,偏向锁会有一个延迟,默认是4秒
为什么?因为JVM虚拟机自己有一些默认启动的线程,里面有很多sync的代码,这些sync代码启动时就知道肯定有竞争,如果使用偏向锁,就会造成偏向锁不断进行锁撤销和锁升级的操作,效率极低。