syncronized锁升级的过程

synchronized

synchronized是一种对象锁(锁的是对象而非引用),作用粒度是对象,java中每个对象都可以上锁(同一时间只有一个线程能上锁成功),而且通过对象内部存储的markword标记锁状态。

在jdk老版本的时候使用的是重量级锁,但是在jdk更新之后才出现的锁升级。

锁一般分为4个转态:无锁->偏向锁->轻量级锁->重量级锁。

锁升级的过程是不可逆的。

 偏向锁:

 当只有一个线程a获得锁时,这个时候锁为偏向锁,这个时候markword就指向a,当a请求锁的时候,就无需任何的操作了,这样可以省很多时间。

轻量级锁:

当线程A获得锁之后,这个时候又来了线程B申请锁,这个时候就有了竞争关系,这个时候就出现了轻量级锁,如果A这时候还在使用锁,B这时候就会自旋,B认为A不会使用太长的时间,如果当B来了之后A不在使用了,这个时候markword直接指向B。一般情况下这样子的情况比较多,可以更好的节约cpu的利用率。

 重量级锁:

跟上面轻量级锁差不多,但是不一样的是,当A在使用的时候,这时候markword是指向A的,这时候B来了,CDE也来了,这时候BCDE会互相竞争,但是竞争力度比轻量级锁大,这个时候重量级锁依赖操作系统的Mutex lock实现,此时等待锁的线程挂起,当锁释放后再由操作系统唤醒重新尝试获取锁,由于借助操作系统,导致用户态内核态切换,此过程时间成本比较高。

在原始的时候synchronzie使用的就是重量级锁,使用的cpu效率不是很高,到现在使用的才是锁升级过程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值