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

Synchronized锁升级过程

  1. 无锁状态(无锁):当一个线程访问一个没有被锁定的Synchronized代码块时,处于无锁状态。此时,线程可以直接进入临界区执行代码,不需要进行任何锁协调。

  2. 偏向锁状态(偏向锁):当一个线程访问一个Synchronized代码块时,会尝试获取偏向锁。如果当前没有其他线程竞争同一个锁,并且之前没有发生过锁竞争,那么当前线程会获得偏向锁,并将对象头中的线程ID记录下来。此后,线程再次进入同步块时,无需再次竞争锁,直接进入临界区执行代码。

  3. 轻量级锁状态(轻量级锁):当多个线程竞争同一个锁时,偏向锁会升级为轻量级锁。在轻量级锁状态下,线程会尝试使用CAS(Compare and Swap)操作来获取锁,如果成功获取锁,则进入临界区执行代码。如果获取锁失败,表示有其他线程竞争锁,那么线程会膨胀为重量级锁。

4.自旋锁
自旋锁会假设在不久将来,当前的线程可以获得锁,因此虚拟机会让当前想要获取锁的线程做几个空循环(这也是称为自旋的原因),一般不会太久,可能是50个循环或100循环,在经过若干次循环后,如果得到锁,就顺利进入临界区。如果还不能获得锁,那就会将线程在操作系统层面挂起,这就是自旋锁的优化方式,这种方式确实也是可以提升效率的。最后没办法也就只能升级为重量级锁了。

  1. 重量级锁状态(重量级锁):当多个线程竞争同一个锁,并且轻量级锁获取锁失败时,锁会升级为重量级锁。在重量级锁状态下,线程会进入阻塞状态,等待锁的释放。当锁的持有者释放锁时,等待的线程会被唤醒,竞争锁的所有线程再次尝试获取锁。
http://www.lryc.cn/news/109722.html

相关文章:

  • 汽车电子功能安全
  • ARM进阶:内存屏障(DMB/DSB/ISB)的20个使用例子详解
  • Cpp学习——模板
  • HTTP 协议 版本详解
  • PHP语言基础知识(超详细)
  • Flex弹性盒子的项目属性
  • 广州银行信用卡中心:强化数字引擎安全,实现业务稳步增长
  • 【Rust日报】2023-08-03 - Polars 获约 400 万美元种子轮融资
  • 装修小程序,开启装修公司智能化服务的新时代
  • 使用PHP和Redis实现简单秒杀功能
  • C#开发FFMPEG例子(API方式) FFmpeg拉取udp组播流并播放
  • Android性能优化—图片优化
  • 如何搭建自动化测试框架?资深测试整理的PO模式,一套打通自动化...
  • 软件外包开发的GO语言特点
  • 【深度学习Week4】MobileNet_ShuffleNet
  • 649. Dota2 参议院
  • 无人机管控平台,推动电力巡检管理水平提升
  • 阿里云平台WoSignSSL证书应用案例
  • 服务器时钟同步
  • AMEYA360:瑞萨电子MCU和MPU产品线将支持Microsoft Visual Studio Code
  • JSP--Java的服务器页面
  • 07 Ubuntu中使用poetry工具管理python环境——巨详细!!!
  • 射影平面 与 射影变换
  • (202307)wonderful-sql:决胜秋招(task6)
  • Scratch 教程:如何实现文本分割
  • 安全基础 --- 编码(02)+ form表单实现交互
  • 华为OD机考真题--五子棋--带答案
  • 把网站改为HTTPS访问方法
  • 【BASH】回顾与知识点梳理(四)
  • 阿里云安全组设置