java-锁类型及其升级流程

发布于:2023-05-16 ⋅ 阅读:(422) ⋅ 点赞:(0)

1, 背景:加锁(重量级锁)是一种阻塞等待的行为, 在某些场景下,可以用别的方案来代替阻塞,提升cpu利用率,让cpu不用在那闲着
2,重入锁场景:某线程在持有某锁时, 再次申请该锁,这种场景下,产生了 偏向锁. 偏向锁是第一次枷锁时的锁的类型.这个第一步的逻辑是,从锁对象头的mark word里判断当前锁是否偏向锁,且持有锁的线程是否当前线程,如果是,则锁成功.如果否, 则修改mark word里的锁类型 ,改为轻量级锁
3,当获取到锁之后执行的任务耗时较低时,比如对某个变量自增,其他的竞争锁可以让cpu循环多次尝试竞争锁,这个行为就是自旋, 此时的锁类型 是轻量级锁.
4,当获取到锁之后执行的任务耗时较高时,其他线程自旋一定次数后,发现仍然没获得锁, 此时,就将 mark word里的锁类型升级成 重量级锁. 从此, 有线程想竞争该锁,只要CAS竞争失败, 就只能阻塞了.

参考:https://blog.csdn.net/qq_45795744/article/details/123493673?s...


网站公告

今日签到

点亮在社区的每一天
去签到