前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >并发编程讲解(三)

并发编程讲解(三)

作者头像
用户7386338
发布2020-05-29 11:46:38
2310
发布2020-05-29 11:46:38
举报
文章被收录于专栏:Java患者Java患者

锁的种类

Java 中锁的种类包括偏向锁自旋锁轻量级锁重量级锁。锁的使用方式先提供偏向锁,如果不满足的时候,升级为轻量级锁,再不满足,升级为重量级锁。自旋锁是一个过渡的锁状态,不是一种实际的锁类型。锁只能升级不能降级

偏向锁

偏向锁是一种编译解释锁。如果代码中不可能出现多线程并发争抢同一个锁的时候,JVM 编译代码,解释执行的时候,会自动的放弃同步信息。消除 synchronized 的同步代码结果。可以避免锁的争抢和锁池状态的维护,提高JVM解释效率。

代码语言:javascript
复制
Object o = new Object();
public void m() {
    o = new Object();
    synchronized (o) {
    }
}

轻量级锁

当偏向锁不满足,也就是有多线程并发访问,锁定同一个对象的时候,先提升为轻量级锁。也是使用标记 ACC_SYNCHRONIZED 标记记录的。ACC_UNSYNCHRONIZED 标记记录未获取到锁信息的线程。就是只有两个线程争抢锁标记的时候,优先使用轻量级锁。A线程和monitor有直接关联的。B线程不记录monitor,是monitor记录B线程,线程A结束后,B两个线程才找到monitor。但也可能有时候还是会出现重量级锁。

自旋锁

自旋锁是一个过渡锁,是偏向锁和轻量级锁的过渡。当获取锁的过程中,未获取到。为了提高效率,JVM 自动执行若干次空循环再次申请锁,而不是进入阻塞状态的情况。故称为自旋锁。自旋锁提高效率就是避免线程状态的变更

重量级锁

自旋锁不会一直持续自旋下去,当自旋一定次数的时候,还没获取到锁就会进入阻塞,该锁膨胀为重量级锁。重量级会让其他申请线程阻塞,性能降低。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-02-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java患者 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 偏向锁
  • 轻量级锁
  • 自旋锁
  • 重量级锁
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档