Synchronized锁

news2024/11/20 14:26:42

概览

锁的实现基于对象头重的MarkWord,分为 无锁 -> 偏向锁 -> 轻量锁 -> 重量锁 四个状态
image.png

状态转换

在这里插入图片描述

锁的获取与释放

模型:

  • Markword:指向Monitor的指针
  • Monitor:_cxq,_EntryList,_WaitSet,owner,_recursions[重入数量],_Succ

重量级锁

  • 场景:多线程竞争
  • 获取:
    • 线程T1尝试获取锁,if 当前_owner == NULL,则直接获取,_owner = Self,_recursions = 1; elif owner == Self,则_recursions++;
    • 线程T1发现锁被占用,T1被封装成ObjectWaiter插入到cxq,
      • 若T1是第一个等待线程,则会间歇性尝试获取锁park(interval):8秒
      • 否则无限期挂起park()
  • 释放:
    • _recursions > 0,则_recursions–(减少一次重入)
    • T1释放锁,根据不同的Knob_Qmode选择一个线程唤醒
      • Qmode == 1,则从EntryList取一个线程,若EntryList为空,则将cxq倒置插入到EntryList,再取
      • Qmode == 2,则从cxq重选择一个线程
    • 被选择唤醒的线程,将尝试获取锁

轻量级锁

  • 场景:线程间交替访问临界区(无竞争)
  • 获取:
    • 若无锁
      • T1将对象Lockee的Markword存储到Lock Record的displaced header重
      • 通过CAS尝试将LR的地址存储到Lockee的Markword,成功则表示T1获取了锁,否则进入锁膨胀逻辑
    • 若是轻量级锁,判断是否为T1
      • 是,表示重入,LR的displaced header设置为NULL,表示一次重复
      • 否,进入锁膨胀逻辑
  • 释放:
    • LR的displaced header设置为NULL
    • 若对象的Markword只想LR,从LR的displaced header重将原Markword’恢复,释放锁
    • 否则,进入锁膨胀逻辑
      在这里插入图片描述

偏向锁

  • 场景:仅一个线程访问过临界区
  • 获取与撤销:
    • T1检查锁对象,发现处于无锁,使用CAS将当前线程ID写入锁对象Markword,执行同步块内容
    • T1重入,锁处于偏向状态且threadid就是T1,无需重复获取(无需CAS)
    • T2访问临界区,锁对象处于偏向状态且非偏向自己,则在线程栈重新建一个Lock Record,用于存储对象的Markword,通过CAS尝试将 锁对象更新为LR地址
      • 成功:拥有该锁,锁标志改为00(轻量锁)
      • 失败:膨胀为重量锁

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/686337.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

提高透明LED屏幕显示效果设计指南

设计透明LED屏幕时,可以考虑以下几个因素来提高显示效果: 透明度和亮度:透明LED屏幕的设计目标是实现高透明度和足够的亮度。透明度取决于使用的材料和LED的布局方式。选择高透明度的材料,并确保LED的亮度足够高,以确保…

写给毕业季的学生们|我的五次 offer 选择经历

最近临近毕业季,群里有好多朋友在问面试和 offer 选择的问题,我分享下我过往的相关经历,希望能给各位朋友有所启发。 我是谁? 大家好,我是拭心,内蒙古人,16 年本科毕业于西安电子科技大学&#…

AWTK学习笔记

编译:scons 运行:.\bin\demo.exe xml文件存放在工程的design\default\ui文件夹内 c文件存放在工程的src文件夹内 如果代码没有指定修改,默认按照AWTK Designer设置的控件属性动作运行 API函数查看使用说明:https://awtk.zlg.cn/ap…

Pytorch ----注意力机制与自注意力机制的代码详解与使用

注意力机制的核心重点就是让网络关注到它更需要关注的地方 。 当我们使用卷积神经网络去处理图片的时候, 我们会更希望卷积神经网络去注意应该注意的地方,而不是什么都关注 ,我们不可能手动去调节需要注意的地方,这个时候&#x…

centos 7.9离线下载安装vscode,以及插件安装下载

文章目录 一、软件的下载1.采取的方法2.下载相应压缩包3.安装过程4.相关知识 二、插件的安装和下载1.查看vscode的版本号2.查找插件的版本号3.安装vscode插件 三、vscode以及依赖安装包,常用插件百度云: 一、软件的下载 1.采取的方法 从一台联网的cento…

SpringBoot2概览-开发实用篇

知识点 热部署 概念:项目刚启动时需要完成重启重载,而热部署只要重启即可(即仅加载当前开发者自定义开发的资源,不加载jar资源) 重启:加载自定义开发代码,包含类、页面、配置文件等,加载位置在restart类加载…

springboot项目如何将配置文件外挂

为什么要将配置文件外挂 因为springboot项目一般打出来的是jar包,如果要对里面的配置做修改,会比较麻烦,所以需要将配置文件外挂,方便操作哦 怎么做呢 我们先看一个常见的springboot项目的配置文件结构: 分为四个配…

InnoDB的三种行锁(提供具体sql执行案例分析)

InnoDB存储引擎有3种行锁的算法,其分别是: Record Lock(记录锁):单个行记录上的范围 (锁住某一行记录)Gap Lock(间隙锁):间隙锁,锁定一个范围,但不包含记录本…

十大公认音质好的骨传导耳机,几款音质排行靠前的骨传导耳机

骨传导耳机是通过头部骨迷路传递声音,而不是直接通过耳膜的振动来传递声音。与传统的入耳式耳机相比,骨传导耳机不会堵耳朵,在跑步、骑车等运动时可以更好的接收外界环境音,保护听力,提升安全性。此外,骨传…

Canvas基本使用

1.canvas基本使用 1.1.说明: canvas是双标签,h5中新增的属性默认宽高为300*150浏览器默认canvas展示的是一张图片给canvas添加文字内容是没有任何意义的canvas画布:绘制图形,显示一个文字,必须通过js操作 不要通过样式去设置画…

15.OCR

15.1 OCR流水线及七工作原理 Photo OCR:照片 光学字符识别(photo optical character recognition) Photo OCR注重的问题:如何让计算机都出图片中的文字信息,它有以下步骤: 首先给定某张图片,它将图像扫描一遍&#…

基于小程序的用户服务技术研究

目录 1. 小程序开发技术原理 2. 用户服务设计3. 数据库设计和管理4. 安全和隐私保护5. 性能优化和测试总结 关于基于小程序的用户服务技术研究,这是一个非常广泛和复杂的领域,需要涉及多个方面的知识和技术。一般来说,基于小程序的用户服务技…

零基础想入门网安行业,看这一篇就够了!!!

由于我之前写了不少网络安全技术相关的故事文章,不少读者朋友知道我是从事网络安全相关的工作,于是经常有人在微信里问我: 我刚入门网络安全,该怎么学?要学哪些东西?有哪些方向?怎么选&#xff…

跟着AIGC学Linux:简介(一)

文章目录 1.Linux内核的历史2.基本概念3.发行版4.Linux应用领域5.Linux VS Windows横向对比表格: 1.Linux内核的历史 Linux内核最初由一位名叫Linus Torvalds的芬兰计算机科学家于1991年创建。当时,Torvalds是一名赫尔辛基大学的学生,他在寻…

ROS:话题通信机制详解

目录 ROS:通信机制一、话题通信简介二、话题通信实操(C)2.1分析2.2发布方代码2.3订阅方代码2.4配置CMakeLists.txt2.5执行2.6注意 三、话题通信实操(python)3.1分析3.2发布方代码3.3订阅方代码3.4添加可执行权限3.5配置…

Apache Log4j2 漏洞原理

Apache Log4j 远程代码执行漏洞 1.漏洞危害 Apache Log4j被发现存在一处任意代码执行漏洞,由于Apache Log4j2某些功能存在递归解析功能,攻击者可直接构造恶意请求,触发远程代码执行漏洞。经验证,Apache Struts2、Apache Solr、Ap…

Win10控制面板在哪里打开?Win10控制面板打开方式介绍

Win10控制面板在哪里打开?当前很多用户都在使用Win10系统,一些新手用户不清楚在哪里才能打开Win10系统的控制面板,以下给大家介绍三种方式,帮助用户们轻松快速打开Win10控制面板,打开控制面板后用户即可展开不同的设置…

5-1图像信息提取适当剪掉像素点(matlab程序)

代码及运行结果 clear ; close all; gr imread(cameraman.tif); subplot(1,3,1); imshow(gr); subplot(1,3,2); D dct2(gr); F log(abs(D)); imshow(F,[]); subplot(1,3,3); D(abs(D)<200) 0; %会丢掉很多点 &#xff0c;但是原图还可识别&#xff0c;适合做信息提取 M …

这所院校很保护一志愿,学硕爆冷,全部录取,专硕初试第三竟主动放弃录取!

一、学校及专业介绍 广州大学&#xff08;Guangzhou University&#xff09;&#xff0c;简称广大&#xff08;GU&#xff09;&#xff0c;是由广东省广州市人民政府举办的全日制普通高等学校&#xff0c;实行省市共建、以市为主的办学体制&#xff0c;是国家“111计划”建设高…

c语言结构体属性之__attribute__((packed))

c语言结构体属性之__attribute__((packed)) 0. 引出 事情是这样的&#xff0c;最近在做代码移植时见到了这样一段代码 typedef struct {uint16_t len;uint8_t data[PAIRING_MAX_LEN]; } pairing_rx_buffer_t;static pairing_rx_buffer_t pairing_rx_buffer {}; typedef str…