synchronized 中4种锁状态

2023-05-16

4种锁状态:无锁,偏向锁,轻量级锁,重量级锁:

偏向锁:当一个线程访问加了同步锁的代码块时,会在对象头中存储当前线程ID,后续当这个线程再次进入/推出这段代码块的时候,不需要再次加锁和释放锁。而是直接比较对象头中是否存储了指向当前线程的偏向锁。如果相等表示偏向锁是偏向于当前线程的,就不需要再次尝试获得锁。

偏向锁的获取:

1、获取偏向锁对象的Markword,判断当前锁对象是否为可偏向状态,当basiced_lock=1&threadId = null

2、如果是可偏向状态,可以通过CAS操作,把当前线程的ID写入到Markword中:

          CAS操作成功,表示已经获得锁对象的偏向锁,接着就可以执行同步代码块,

          CAS操作失败,表示其他的线程已经获得了偏向锁,并且锁对象存在竞争,需要撤销偏向锁的线程,并把当前线程持有的偏向锁升级为轻量级锁才能执行(锁升级需要等到全局安全点--没有线程在执行字节码)

3、已经是偏向锁的,需要查看Markword中的ThreadID是否等于当前线程的ThreadID,相等,直接执行同步代码块;不相等,说明锁已经偏向了其他的线程,存在锁竞争,需要撤销偏向锁,并把当前,升级成轻量级锁。

偏向锁的撤销

偏向锁的撤销并不是将锁对象降级为无锁状态,而是在获取偏向锁的时候,CAS失败就存在锁竞争,需要将锁升级为轻量级锁的状态;如果原先获得偏向锁的线程已经执行完同步代码块,退出了临界区,此时会把对象头设置成无锁状态,并且争抢锁的线程可以基于CAS重新偏向当前的线程;如果原来的偏向锁线程还未执行完同步代码块,在临界区内,需要将偏向锁升级为轻量级锁之后继续执行同步代码块。

轻量级锁的加锁与解锁

锁升级为轻量级锁之后,对象中的Markword也会进行相应的变化。首先线程在自己的栈桢中创建记录LockRecord;再将锁对象的对象头中的Markword复制到线程刚刚创建的锁记录LockRecord中;然后将锁记录中的Owner指针指向锁对象。最后CAS操作将锁对象的对象头的Markword替换为指向锁记录的指针。

轻量级锁的解锁

轻量级锁的锁释放逻辑其实就是获得锁的逆向逻辑,通过CAS操作将线程栈桢中的LockRecord替换回到锁对象的Markword中,如果成功表示没有竞争。如果失败表示当前锁存在竞争,就会将轻量级锁升级为重量级锁。

锁升级为重量级锁之后,获取到对象锁的线程执行同步代码块,没有获取到对象锁的线程只能被挂起阻塞,被唤醒,等待获取到锁的线程释放锁之后,重新获取锁。

每一个java对象都会与一个监视器monitor关联,我们可以将它理解为一把锁,当一个线程想要执行一段被synchronized修饰的同步方法或者代码块的时候,该线程必须先获取对象锁对应的monitor。monitorenter表示去获取一个对象监视器,monitorexit表示释放monitor监视器,使得其他被阻塞的线程有机会去获得这个监视器。

monitor依赖操作系统的MutexLock(互斥锁)来实现,线程被阻塞之后便进入到了内核调度状态,这个操作会导致系统在用户态和内核台之间来回的切换,严重影响锁的性能。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

synchronized 中4种锁状态 的相关文章

  • 消息队列技术介绍

    一 消息队列概述 消息队列中间件是分布式系统中重要的组件 xff0c 主要解决应用耦合 异步消息 流量削锋等问题 实现高性能 高可用 可伸缩和最终一致性架构 是大型分布式系统不可缺少的中间件 目前在生产环境 xff0c 使用较多的消息队列有
  • Ubuntu 循环登录 解决办法

    Ubuntu 经常出现循环登录的情况 但需要根据不同原因 采用不同的解决方案 已知情况有 Xauthority 权限变为root 修改到自己账户权限即可nvidia 显卡驱动问题 卸载重装即可 Xauthority 权限问题 参考Ubunt
  • Kotlin基础(一)android studio中配置Kotlin

    1 何为Kotlin xff1f Kotlin是一门运行在JVM之上的语言 它由Jetbrains创建 xff0c 而Jetbrains则是诸多强大的工具 xff08 如知名的Java IDE IntelliJ IDEA xff09 背后的
  • 关于Ubuntu18.04 root账户登录的问题

    关于Ubuntu18 04 root账户登录的问题 一 Ubuntu 18 04添加root用户登录1 设置root用户2 修改 root profile3 修改 96 etc pam d 96 目录下的 96 gdm autologin
  • Ubuntu下fcitx崩溃,搜狗输入法乱码

    转载 xff1a https www findhao net res 786 预防原文删除 xff0c 侵删 方法 直接重启fcitx即可 xff1a fictx自带的重启 fcitx r 或者执行以下三条 xff1a 获得fcitx的进程
  • KVM虚拟化

    KVM虚拟化 文章目录 KVM虚拟化虚拟化简介 KVMKVM部署CPU虚拟化功能kvm管理界面安装 虚拟化简介 虚拟化 xff1a 在一台计算机上虚拟出多个逻辑的计算机 xff0c 而且每个逻辑计算机它可以是不同的操作系统 虚拟化技术 xf
  • Android系统Camera图片反转的一个问题

    一 问题提出 目前遇到项目问题 xff0c Camera预览图像是反的 xff0c 于是考虑设置180度反转以便正常 通过如下两种方式 xff1a params setRotation 180 java部分 p set CameraPara
  • I2C总线的SDA和SCL

    串行数据线SDA 负责在设备间传输串行数据 串行时钟线SCL 负责产生同步时钟脉冲 SCL SDA是I2C总线的信号线 I2C总线是共享的总线系统 xff0c 因此可以将多个I2C设备连接到该系统上 连接到I2C中总线上的设备既可以用作主设
  • ubuntu18.04输入密码登录不进去一直循环

    我是把ubuntu分辨率调了之后变成这样的 其实这个解决方法我也很无语 自己乱按弄到的 就是在登录的隔壁 xff0c 勾选第二个就可以了QUQ 评论区所知 xff1a 选择这个话 xff0c 会关掉nvidia显卡 选择wayland进入后
  • rhce2

    1 配置chrony时间服务器 xff0c 确保客户端主机能和服务主机同步时间 两台机器 第一台机器作为时间服务器从ntp aliyun com同步时间 xff08 注意包含意外情况 xff0c 如果不能上外网 xff0c 不能从阿里云同步
  • FFmpeg Android编译运行出现 Abort message: 'JniInvocation instance already initialized'

    signal 5 SIGTRAP code 1 TRAP BRKPT fault addr 0x272000000d03 Abort message JniInvocation instance already initialized 把
  • layui图标用法总结

    本文参考官方文档 layui图标使用官方文档 xff0c 建议先看此文章 xff0c 并结合本文的前两个步骤使用即可 1 下载layui js相关文档 xff0c layui js下载 xff0c 下载之后里面的内容如下 xff1a 只需要
  • Eggjs学习系列(一) 使用TypeScript快速入门

    Eggjs学习系列 xff08 一 xff09 使用TypeScript快速入门 Eggjs是一个node的渐近式开发框架 xff0c 用于服务端开发 而 TypeScript 是 JavaScript的超集 xff0c 在兼容 JavaS
  • Golang实现小型CMS内容管理功能(二):前端接入百度ueditor富文本编辑器

    当我们把接口都做好以后 xff0c 我们需要去开发前端界面 添加文章功能里面 xff0c 最重要的就是文章内容部分 xff0c 需要配置上富文本编辑器 xff0c 这样才能给我们的内容增加样式 下载ueditor代码 ueditor已经很久
  • 网络分析中数据包结构(含七层模型)

    七层模型 xff1a 包 Packet 是TCP IP协议通信传输中的数据单位 xff0c 一般也称 数据包 有人说 xff0c 局域网中传输的不是 帧 Frame 吗 xff1f 没错 xff0c 但是TCP IP协议是工作在OSI模型第
  • ubuntu下PyCharm遇到问题

    第三方库没有自动补全功能 xff08 autocomplete xff09 190921补充 xff1a 这个问题就是环境配置的问题当初真是无知 原因 xff1a PyCharm的人工编译环境和程序的运行环境不是同一个 xff08 说的太不
  • 用java简单的实现单链表的基本操作

    此代码仅供参考 xff0c 如有疑问欢迎评论 xff1a package com tyxh link 节点类 public class Node protected Node next 指针域 protected int data 数据域
  • 算法:海量日志数据,提取出某日访问百度次数最多的那个IP

    首先是这一天 xff0c 并且是访问百度的日志中的IP取出来 xff0c 逐个写入到一个大文件中 注意到IP是32位的 xff0c 最多有个2 32个IP 同样可以采用映射的方法 xff0c 比如模1000 xff0c 把整个大文件映射为1
  • 使用JUnit测试预期异常

    开发人员常常使用单元测试来验证的一段儿代码的操作 xff0c 很多时候单元测试可以检查抛出预期异常 expected exceptions 的代码 在Java语言中 xff0c JUnit是一套标准的单元测试方案 xff0c 它提供了很多验
  • BlockingQueue深入分析

    1 BlockingQueue 定义的常用方法如下 抛出异常特殊值阻塞超时插入add e offer e put e offer e time unit 移除remove poll take poll time unit 检查element

随机推荐

  • 聚合类新闻客户端产品功能点详情分析

    产品功能点 功能 今日头条 百度新闻 鲜果 ZAKER 媒体订阅 个性化内容推荐 个性化订阅 RSS 视频新闻 评论盖楼 搜索新闻 离线下载 地方新闻 一键分享 收藏 推送 天气 夜间模式 线上活动 主题设置 感兴趣 语音读文章 字体设置
  • 聚合类新闻客户端初体验

    初体验的产品 xff1a 今日头条 ios3 6 百度新闻 ios4 4 0 ZAKER ios4 4 5 鲜果 ios3 8 7 中搜搜悦 ios4 0 1 Flipboard ios2 3 9 1 Flipboard 一款国外很火的ap
  • 聚合类新闻客户端的改进

    zaker和鲜果是最早的聚合类新闻产品 xff0c 前几年发展很快 xff0c 迅速占领了市场 xff0c 但近两年发展变得缓慢 xff0c 而今日头条自发布以来才两年 xff0c 用户量就迅速超过了zaker和鲜果 xff0c 使用起来非
  • 单例模式优缺点

    主要优点 xff1a 1 提供了对唯一实例的受控访问 2 由于在系统内存中只存在一个对象 xff0c 因此可以节约系统资源 xff0c 对于一些需要频繁创建和销毁的对象单例模式无疑可以提高系统的性能 3 允许可变数目的实例 主要缺点 xff
  • 适配器模式优缺点

    优点 xff1a 1 将目标类和适配者类解耦 2 增加了类的透明性和复用性 xff0c 将具体的实现封装在适配者类中 xff0c 对于客户端类来说是透明的 xff0c 而且提高了适配者的复用性 3 灵活性和扩展性都非常好 xff0c 符合开
  • Oracle 的 Round函数

    Round函数用法 xff1a 截取数字 格式如下 xff1a ROUND xff08 number decimals xff09 其中 xff1a number 待做截取处理的数值 decimals 指明需保留小数点后面的位数 可选项 x
  • Ubuntu安装卸载软件

    VMware 1 首先 xff0c 官网下载 vmware 虚拟机 2 转到下载目录下 给vmware升权限 sudo chmod 43 x VMware Workstation Full 15 1 0 13591040 x86 64 bu
  • eclipse报错:Failed to load the JNI shared library

    电脑自装系统以来 xff0c 好久没有写java代码了 xff0c 所以一直也没用 eclipse IDE xff0c 今天将eclipse打开 xff0c 报了个问题 xff0c Failed to load the JNI shared
  • ACM 鸡兔同笼 线性代数linear algebra

    想模仿线性代数变化的步骤写程序但总感觉失去了灵魂 java Scanner sc 61 new Scanner System in int head 61 sc nextInt int leg 61 sc nextInt int arr 6
  • 使用Example_where_Cause出现 Column 'goods_id' in where clause is ambiguous解决办法

    改写SSM项目https www bilibili com video BV18J411k7SF from 61 search amp seid 61 7715680395343362130出现 Column 39 goods id 39
  • 在CLI中打印表格----gotable使用介绍

    目录 介绍 获取gotable 在github中获取 下载源码 git clone go mod API 创建table 从结构体中创建空table 获取版本信息 获取版本列表 打印表格 给表格添加行 给表格添加多个行 给表格添加列 介绍
  • 抽象类和普通类

    包含抽象方法的类称为抽象类 xff0c 但并不意味着抽象类中只能有抽象方法 xff0c 它和普通类一样 xff0c 同样可以拥有成员变量和普通的成员方法 注意 xff0c 抽象类和普通类的主要有三点区别 xff1a 1 抽象方法必须为pub
  • 优化器(Optimizer)(SGD、Momentum、AdaGrad、RMSProp、Adam)

    文章目录 3 1 传统梯度优化的不足 BGD SGD MBGD 3 1 1 一维梯度下降3 1 2 多维梯度下降 3 2 动量 Momentum 3 3 AdaGrad算法3 4 RMSProp算法3 5 Adam算法 优化器在机器学习 深
  • ViewBinding绑定布局

    最近这段时间在学习Kotlin xff0c 突然发现谷歌已经把kotlin android extensions插件废弃 xff0c 目前推荐使用ViewBinding来进行替代 xff0c 接下来通过本文给大家分享Android使用Vie
  • element-ui更改图标icon大小

    element ui改变icon大小 在template里面加入div lt div class 61 34 change icon 34 gt lt i class 61 34 el icon switch button 34 gt lt
  • @PathVariable注解

    转自 xff1a http www cnblogs com FFFFF p 4624140 html 使用 64 PathVariable可以快速的访问 xff0c URL中的部分内容 在 64 RequestMapping的value中使
  • Ubuntu安装Google Chrome,报NSS version的错误

    使用网上的教程安装google chrome xff0c 启动时报这个错误 xff1a 4594 4630 1021 124049 156901 FATAL nss util cc 632 NSS VersionCheck 34 3 26
  • gitlab操作 in pycharm

    1 install gitlab projects plugins 如果遇到 marketplace plugins are not loaded 查看 34 ubuntu下PyCharm 34 遇到问题博文 2 version contr
  • 挂载system.img

    将多个system压缩成单个img文件 xff0c 需要文件 xff1a generate image xff08 版本里有 xff0c img生成器 xff09 所有的system img文件以及system ini文件 generate
  • synchronized 中4种锁状态

    4种锁状态 xff1a 无锁 xff0c 偏向锁 xff0c 轻量级锁 xff0c 重量级锁 xff1a 偏向锁 xff1a 当一个线程访问加了同步锁的代码块时 xff0c 会在对象头中存储当前线程ID xff0c 后续当这个线程再次进入