Synchronized锁升级

锁的4中状态:无锁状态、偏向锁状态、轻量级锁状态、重量级锁状态(级别从低到高)

为什么要引入偏向锁?

因为经过HotSpot的作者大量的研究发现,大多数时候是不存在锁竞争的,常常是一个线程多次获得同一个锁,因此如果每次都要竞争锁会增大很多没有必要付出的代价,为了降低获取锁的代价,才引入的偏向锁。

为什么要引入轻量级锁?

轻量级锁考虑的是竞争锁对象的线程不多,而且线程持有锁的时间也不长的情景。因为阻塞线程需要CPU从用户态转到内核态,代价较大,如果刚刚阻塞不久这个锁就被释放了,那这个代价就有点得不偿失了,因此这个时候就干脆不阻塞这个线程,让它自旋这等待锁释放。

轻量级锁什么时候升级为重量级锁?

自旋的时间太长也不行,因为自旋是要消耗CPU的,因此自旋的次数是有限制的,比如10次或者100次,如果自旋次数到了线程1还没有释放锁,或者线程1还在执行,线程2还在自旋等待,这时又有一个线程3过来竞争这个锁对象,那么这个时候轻量级锁就会膨胀为重量级锁。重量级锁把除了拥有锁的线程都阻塞,防止CPU空转。

*注意:为了避免无用的自旋,轻量级锁一旦膨胀为重量级锁就不会再降级为轻量级锁了;偏向锁升级为轻量级锁也不能再降级为偏向锁。一句话就是锁可以升级不可以降级,但是偏向锁状态可以被重置为无锁状态。

这几种锁的优缺点(偏向锁、轻量级锁、重量级锁)

最新文章

  1. linux 安装maven
  2. 优化php代码 - 字符串echo输出 逗号也可作php连接符
  3. yii 常用的多表查询
  4. BZOJ2707 : [SDOI2012]走迷宫
  5. CPrintDialog
  6. sql 删除表数据truncate delete drop的区别
  7. Zoj3332-Strange Country II(有向竞赛图)
  8. BZOJ 1880: [Sdoi2009]Elaxia的路线( 最短路 + dp )
  9. 基本Guava工具
  10. Linux下安装Redis php-redis扩展 redis重启shell脚本 超详细!
  11. 初识C语言(一)
  12. Code Review —— by12061154Joy
  13. chromium ③
  14. Must be between v0 and v15, inclusive解决办法
  15. WinForm中使用CrystalReport水晶报表——基础,分组统计,自定义数据源
  16. Jmeter性能指标分析
  17. Python 部署 flask 用uwsgi和nginx
  18. 了解什么是版本控制 & 用tortoiseSVN 建立本地版本库来管理自己的代码
  19. Right-BICEP 测试四则运算程序
  20. 关于HTML5中hash部分API在历史管理,选项卡自动跳转中的一点使用

热门文章

  1. [CSP-S模拟测试]:chess(数学)
  2. Oracle诊断: 服务器启后,无法连接
  3. 开源认证组件汇总 Kerberos和CAS
  4. 关于Java泛型实现原理的思考与一般用法示例总结
  5. React-Native 之 GD (四)使用通知方式隐藏或显示TabBar
  6. XML的基础之一(概念和语法)
  7. ajax传递json参数
  8. ubuntu 安装maven
  9. MongoDB--(NoSQL)入门介绍
  10. 阶段1 语言基础+高级_1-3-Java语言高级_03-常用API第二部分_第1节 Object类_1_Object类的toString方法