synchronized的底层的实现

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代码启动时就知道肯定有竞争,如果使用偏向锁,就会造成偏向锁不断进行锁撤销和锁升级的操作,效率极低。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值