深入浅出synchronized关键字 、无状态锁、偏量锁、轻量锁、重量锁

synchronized在做开发的时候或多或少都用过 但是对与理解方便之前只是简单的认为是一个锁 加上之后可以处理多线程下的安全隐患 但是会降低系统的效率 因为一个线程加锁之后其余线程都会在外部进行等待 殊不知其实JDK已经对其锁进行了较大规模的升级

 

锁的状态有四种  无状态锁、偏向锁、轻量锁、重量锁

在长期的实践发现 一个线程在多次调用锁的情况是时有发生的 所以当在线程第一次获取锁的时候锁会读取线程里的threadid 且记录下来 在后期如果同一个线程再次进来判断其threadid一致时就直接放行 避免开锁关锁的消耗 如果是另一个线程 就进行判断之前的线程是否为存活状态 不是的话就把锁重置为无状态锁 再让其余线程进入转化为轻量级锁 

ps:轻量级锁默认是开启且在程序执行四秒后生效 可以通过XX:BiasedLockingStartUpDelay=0取消限制 也可以那么可以通过-XX:-UseBiasedLocking = false来取消偏向锁

当第二个线程开始抢占的时候会让第二个锁先进行自旋状态 当超过一定次数(默认十次)或者当第二个线程在自旋的过程中第三个线程也进行抢占资源 那么会升级为重量级锁

注意:锁的状态除了偏向锁可以转为无状态锁 其余了只可以升级 不可以降级

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值