初步了解synchronized 的优化过程

21 篇文章 0 订阅

基本的特点(JDK 1.8)

1. 开始时是乐观锁, 如果锁冲突频繁, 就转换为悲观锁.
2. 开始是轻量级锁实现, 如果锁被持有的时间较长, 就转换成重量级锁.
3. 实现轻量级锁的时候大概率用到的自旋锁策略
4. 是一种不公平锁
5. 是一种可重入锁
6. 不是读写锁
JVM将synchronized的锁分为 无锁、偏向锁、轻量级锁、重量级锁 状态。会根据情况,进行依次升级

锁能升级不能降级

偏向锁

第一个尝试加锁的线程, 优先进入偏向锁状态,这里并不是真正的加锁就是设置一个标记位,等线程冲突的时候在加锁

轻量级锁

随着其他线程进入竞争, 偏向锁状态被消除, 进入轻量级锁状态(自适应的自旋锁).

通过 CAS 检查并更新一块内存 (比如 null => 该线程引用)
如果更新成功, 则认为加锁成功
如果更新失败, 则认为锁被占用, 继续自旋式的等待(并不放弃 CPU).

重量级锁

如果竞争进一步激烈, 自旋不能快速获取到锁状态, 就会膨胀为重量级锁

其他的优化

锁消除

JVM自动判定,发现效果地方的代码,不必加锁,如果写了synchronized,就好自动把锁去掉

JVM是比较保守的,如果100%能消除就会消除,如果%80能消除就不会消除的

锁粗话

一段逻辑中如果出现多次加锁解锁, 编译器 + JVM 会自动进行锁的粗化.
举个例子理解锁粗化

第一种方式

我写作业,我家长要我写完告诉它,于是

我每写一道题,就跟他说这一一道题写完了,

写了10道,告诉了10遍。

这个就属于锁的粒度细

第二种方式

我写作业,我家长要我写完告诉它,于是

我把作业都写完,在跟家长说写完了

就告诉了一遍

这个就属于锁的粒度粗

锁粗活要针对一个对象,才能除话,虽然一次干的事情多了,但是报告的次数少了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值