synchronized 锁的升级

本文介绍了Java中synchronized锁在JDK1.6之前的重量级锁问题,以及后续的锁升级过程,包括无锁、偏向锁、轻量级锁和重量级锁。重点讲解了锁升级的触发条件和性能提升策略。

锁的状态

synchronized 在jdk1.6之前是重量级锁,每次都要去和操作系统打交道,而操作系统层面的操作是比较耗性能的,需要将用户态转换为内核态。所以在jdk1.6后就有了锁的升级过程,总共有四种状态:无锁、偏向锁、轻量级锁、重量级锁。从无锁到重量级锁,锁的粒度在不断加大,而且锁的升级过程是不可逆的。

锁的升级过程


无锁

线程执行非同步方法,不加锁,通过不断自旋进行对资源的修改操作,只有一个线程能操作成功。

偏向锁

线程进入同步方法后,对象头 Mark Word会记录当前线程的Id,此后如果还是该线程进入该同步方法,就不需要再进行加锁解锁的过程了,提高了性能。此外,偏向锁不会自己撤销,只有等有线程竞争时,要升级为轻量级锁时,才会撤销。


轻量级锁

线程进入同步方法获取到偏向锁后,此时又有别的线程也要进来,他们通过自旋的方式,来回获取锁然后执行,此时趋于一种相对平稳的状态,就升级为了轻量级锁,他们不会被阻塞,而是通过自旋的方式去不断获取并执行。


重量级锁

有大量的线程此时都要获取锁,由于锁的竞争非常激烈,如果还是不断通过自旋的方式的话,CPU会出现空转的情况,会大量消耗性能,所以轻量级锁就会升级为重量级锁,此时就是操作系统层面来操作了,通过Mutex Lock互斥量,来决定哪个线程获取到锁。
                       
原文链接:https://blog.youkuaiyun.com/weixin_51453935/article/details/132133569

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值