synchronized加锁的三个阶段

 synchronized实现了哪种锁策略?

一、偏向锁阶段

概念:

  • 核心思想是“懒汉模式”能不加就不加,能晚加就晚加锁。
  • 当一个线程遇到了一个锁对象,他先标记,而不是直接加锁
  • 一旦他标记的锁对象,被其他线程碰上,其他线程想要对这个锁对象加锁
  • 你这个线程立马抢先其他线程一步对这个锁对象加锁,这时候就是真加锁了
  • 如果没有其他线程和你争夺这个锁对象,那你这个线程也不加锁。

非必要,不加锁.

如此一来,就提升了代码的效率

一旦被迫加锁,就实现了 偏向锁阶段 → 轻量级锁阶段 

二、轻量级锁阶段

其实就是 自旋锁来实现的

反复快速的对一个锁对象尝试加锁

优点就是能第一时间获得锁

缺点是会消耗大量的CPU资源

所以一但竞争锁的线程多了,锁冲突的概率大,导致自旋锁再疯狂的浪费cpu资源,但是又加不上锁

就进入第三个阶段  轻量级锁阶段→重量级锁阶段

三、重量级锁阶段

加锁失败,挂起等待.也就是进入阻塞状态

让出cpu资源

!!!注:锁的阶段一旦升级,是不可逆的。

上面对于synchronized 中锁策略的描述 提到了的自适应,其实就是根据实际情况升级锁的阶段

但是,不可逆。


以上内容输入锁sheng'ji

锁消除:

//synchronized会自动消除一些不必要的锁,比如这个锁里只要读操作,synchronized会认为发生线程安全的问题的概率不大,因此消除掉这个锁,提升了代码的效率.

锁粗化:

//细粒度

指的是锁内的代码相对少

//粗粒度

所内代码相对多

锁粗化之后:

为啥要锁粗化呢?

//因为你不断的加锁解锁而你锁内的代码又不是很多执行速度快,如此反复的加锁解锁必然会消耗大量的cpu资源和降低代码效率,锁粗化就可以解决这个问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值