当前位置: 首页 > news >正文

Synchronized锁升级

Java Synchronized 重量级锁原理深入剖析上(互斥篇)

为什么映入Monitor

处在重量级锁状态时说明有线程没拿到锁需要阻塞等待锁,当拥有锁的线程释放锁后唤醒它继续竞争锁。此处就引入了一个问题:其它线程如何找到被阻塞的线程?我们很容易想到:把阻塞的线程放到多线程共享的(能访问)的列表里。
在这里插入图片描述

mark word

在这里插入图片描述

偏向锁

在这里插入图片描述

轻量级锁在这里插入图片描述在这里插入图片描述

锁重入

// 如果CAS替换不成功,代表锁对象不是无锁状态,这时候判断下是不是锁重入// Is it simple recursive case?if (!call_vm && THREAD->is_lock_owned((address) displaced->clear_lock_bits())) {entry->lock()->set_displaced_header(NULL);} else {// CAS操作失败则调用monitorenterCALL_VM(InterpreterRuntime::monitorenter(THREAD, entry), handle_exception);}

在这里插入图片描述

偏向锁到轻量锁

线程1当前拥有偏向锁对象,线程2是需要竞争到偏向锁。

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

轻量级到重量级锁

当获取锁冲突多,时间越长的时候,线程肯定无法继续在这里死等了,所以只好先挂起,然后等前面获取锁的线程释放了锁之后,再开启下一轮的锁竞争,而这种形式就是我们的重量级锁。
在这里插入图片描述
在这里插入图片描述

http://www.lryc.cn/news/137585.html

相关文章:

  • 记一个宏定义写法
  • 【数据结构】C语言实现栈(详细解读)
  • 3、Spring_容器执行
  • 五、pikachu之RCE
  • 最大不相交区间数量
  • Oracle给表空间添加容量
  • 2023年大数据与区块链国际会议 | EI、Scoups检索
  • 【洛谷算法题】P1000-超级玛丽游戏【入门1顺序结构】
  • ubuntu or kylinos软件安装错误的终极解决方案
  • 30分钟Python自动化从入门到实战(一)
  • FOC之SVPWM学习笔记
  • DSO 系列文章(3)——DSO后端正规方程构造与Schur消元
  • php 使用ES
  • 距离我成为炎帝的一次(比较近的一次)
  • Protobuf在IDEA中的插件安装教程
  • 中间件(上)
  • Python快速检验数据分布
  • uniapp微信小程序点击右上角菜单分享功能权限配置
  • 【OpenVINOSharp】在英特尔® 开发者套件爱克斯开发板使用OpenVinoSharp部署Yolov8模型
  • Django的模型层
  • idea 新建servlet 访问提示404 WebServlet注解找不到包 报错
  • 【EA-ISET协会】Elsevier|2区智慧农业类SCIEI, 进展顺,3个月左右录用~
  • Class类getName获取类名方法详细说明
  • 凉而不冷 柔而不弱 三菱重工海尔舒适风科技助您整夜安眠
  • YOLOv5基础知识入门(7)— NMS(非极大值抑制)原理解析
  • Gpt微信小程序搭建的前后端流程 - 后端基础框架的搭建(三)
  • jstat(JVM Statistics Monitoring Tool):虚拟机统计信息监视工具
  • 【ARM】Day6 cotex-A7核UART总线实验
  • HTTPS代理搭建技巧分享
  • 第四章:树形结构的关联式容器(map+set)