因为偏向锁,锁住对象时,会写入对象头相应的标识,我们先把对象头(官方叫法为:Mark Word)的图示如下(借用了网友的图片):

通过上面的图片,我们可以知道,对象处于偏向锁时,mark word中的偏向锁标记为1,锁标志位为01;下面是分析过jvm源码(biasedLocking.cpp)解析的偏向锁升级流程(忽略一些细节),示例中:线程1当前拥有偏向锁对象,线程2是需要竞争到偏向锁。

  1. 线程2来竞争锁对象;
  2. 判断当前对象头是否是偏向锁;
  3. 判断拥有偏向锁的线程1是否还存在;
  4. 线程1不存在,直接设置偏向锁标识为0(线程1执行完毕后,不会主动去释放偏向锁);
  5. 使用cas替换偏向锁线程ID为线程2,锁不升级,仍为偏向锁;
  6. 线程1仍然存在,暂停线程1;
  7. 设置锁标志位为00(变为轻量级锁),偏向锁为0;
  8. 从线程1的空闲monitor record中读取一条,放至线程1的当前monitor record中;
  9. 更新mark word,将mark word指向线程1中monitor record的指针;
  10. 继续执行线程1的代码;
  11. 锁升级为轻量级锁;
  12. 线程2自旋来获取锁对象;

最新文章

  1. kettle系列-4.kettle定制化开发工具类
  2. 4.DB Initialization(数据库初始化)[EF Code-First系列]
  3. AngularJS快速入门指南09:SQL
  4. 解决无法连接到visual studio开发服务器的问题
  5. hdu 1564 Play a game(博弈找规律)
  6. laravel 安装 Laravel 扩展包
  7. 2778:Ride to School-poj
  8. 框架原理第一讲,熟悉常用的设计方式.(以MFC框架讲解)
  9. three.js 相机
  10. Flex中一些属性总结
  11. 读《Linux内核设计与实现》我想到了这些书
  12. flume原理
  13. fatal error: Eigen3/Core: 没有那个文件或目录
  14. Ceres Solver 入门稍微多一点
  15. Tampermonkey脚本属性
  16. Linux中加速访问github
  17. 【tp5】tp5实现空模块、空控制器、空操作的页面404跳转
  18. PS教程:如何批量处理图片
  19. Mysql 之多实例 安装以及配置
  20. FastDFS简单入门小demo

热门文章

  1. 请写出一段表单提交的HTML代码,表单名称为form1,提交方式为post,提交地址为submit.asp
  2. bootstrap基础学习十一篇
  3. bootstrap基础学习九篇
  4. javascript汇总(转)
  5. boost数据结构any(很有用!)
  6. Amazon【EC2】如何启动一个新的EC2实例
  7. ext布局问题之tab panel内的gridpanel内容数据变多,出现滚动条
  8. java-web 过滤器 & 监听器 & 拦截器
  9. LNK2005 _DllMain@12 mfcs100d.lib
  10. git和svn的详细对比