【并发编程的艺术读书笔记】synchronized锁升级机制详解

news2024/11/24 5:40:59

锁升级机制

    • 简介
    • 锁升级流程
    • 三种锁的优缺点

简介

synchronized在早期被称为重量级锁,而到现在已经得到不少优化。偏向锁、轻量级锁、重量级锁指的是synchronized三种形态。

锁升级流程

无锁(Unlocked)
初始状态,表示对象没有被任何线程锁定。如果线程 A 想要获取这个对象的锁,它会将对象的状态从无锁状态升级为偏向锁状态。

偏向锁(Biased Locking)
当某个线程成功获取了对象的锁时,对象会进入偏向锁状态。在这个状态下,偏向于锁的线程可以连续多次获取锁而不触发同步,从而减少竞争。如果其他线程尝试获取这个锁,偏向锁会升级为轻量级锁状态。

偏向锁一般是针对于只有一个线程访问的情况,这种情况不会发生资源竞争,如果一直只有一个线程访问共享资源,每次访问都要进行获取锁和释放锁的操作,对性能的开销非常大。

而偏向锁的实现方式非常简单同时效率很高只需要在对象头中做一个是偏向锁的标记,然后存储线程ID代表这个资源被某个线程占有。

在这里插入图片描述

当这个线程再次访问这个资源的时候不需要进行加锁和释放锁的操作,直接可以访问资源。

线程访问的时候会对比Mark Word中的线程ID,如果匹配成功就直接访问资源,如果不匹配就去查看偏向锁标记位,看看是否标记有偏向锁(标志位是否为1),如果没有设置,则使用CAS竞争锁;如果设置了**,则尝试使用CAS将对象头的偏向锁指向当前线程,这时就发生了资源竞争,会升级为轻量级锁。**

轻量级锁(Lightweight Locking)
如果有多个线程尝试获取同一个锁,偏向锁会升级为轻量级锁。在轻量级锁状态下,锁会尝试使用CAS(Compare and Swap)操作来尝试获取锁,而不是阻塞线程。如果多个线程竞争激烈,轻量级锁可能会升级为重量级锁。

轻量级锁状态下线程会通过自旋的方式来尝试获取锁(在循环中tryLock),轻量级锁的自旋对cpu的损耗极大,当高并发场景下使用轻量级锁会严重损耗cpu性能。每增加一个线程,其他所有线程都要多自旋一次,开销极大。

在这里插入图片描述

如果多次尝试还无法获取锁,就会升级为重量级锁。

重量级锁(Heavyweight Locking)
当竞争非常激烈且无法通过轻量级锁解决时,锁会升级为重量级锁。这时候,其他线程会被阻塞,直到持有锁的线程释放锁。

进入重量级锁时,只有当前线程执行完所有操作后,通知阻塞队列中的线程后,阻塞队列中的线程才会被唤醒继续竞争。
在这里插入图片描述

三种锁的优缺点

在这里插入图片描述

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

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

相关文章

​ 模拟嵌入式边缘计算卡设计方案:367-XC7Z100 板卡 基于zynq XC7Z100 FMC接口通用计算平台

基于zynq XC7Z100 FMC接口通用计算平台 一、板卡概述 北京太速科技板卡由SoC XC7Z100-2FFG900I芯片来完成卡主控及数字信号处理,XC7Z100内部集成了两个ARM Cortex-A9核和一个kintex 7的FPGA,通过PL端FPGA扩展FMC、光纤、IO等接口,PS端ARM扩展…

智慧高速公路整体解决方案[76页PPT]

导读:原文《76页智慧高速公路整体解决方案PPPT》(获取来源见文尾),本文精选其中精华及架构部分,逻辑清晰、内容完整,为快速形成售前方案提供参考。 喜欢文章,您可以关注评论转发本文&#xff0c…

java excel导出 本地运行数据正常 docker或者服务器导出数据为空 已解决

加上这个 response.addHeader("Content-Type","application/octet-stream;charsetutf-8"); 如图

【python爬虫案例】爬了上千条m端微博签到数据

一、爬取目标 大家好,我是马哥python说,一枚10年程序猿。 今天分享一期python爬虫案例,爬取目标是新浪微博的微博签到数据,字段包含: 页码,微博id,微博bid,微博作者,发布时间,微博内容,签到地点,转发数,评论数,点赞数…

Sphinx——Python生成API文档

1、简介 Sphinx是Python文档生成器,它基于reStructuredText标记语言,可自动根据项目生成HTML,PDF等格式的文档,无数著名项目的文档均用Sphinx生成,如机器学习库scikit-learn、交互式神器Jupyter Notebook sphinx是一…

k8s ingress (二)

k8s ingress (二) Ingress介绍 在前面课程中已经提到,Service对集群之外暴露服务的主要方式有两种:NodePort和LoadBalancer,但是这两种方式,都有一定的缺点: NodePort方式的缺点是会占用很多集群机器的端口&#xff0…

常见的时序数据库

1.概念 时序数据库全称为时间序列数据库。时间序列数据库指主要用于处理带时间标签(按照时间的顺序变化,即时间序列化)的数据,带时间标签的数据也称为时间序列数据。 时间序列数据主要由电力行业、化工行业、气象行业、地理信息…

【高危】Apache Airflow Spark Provider 任意文件读取漏洞 (CVE-2023-40272)

漏洞描述 Apache Airflow Spark Provider是Apache Airflow项目的一个插件,用于在Airflow中管理和调度Apache Spark作业。 受影响版本中,在JDBC连接时,由于没有对conn_prefix参数做验证,允许输入"?"来指定参数。攻击者…

uniapp微信小程序点击右上角菜单分享功能权限配置

个人项目地址: SubTopH前端开发个人站 (自己开发的前端功能和UI组件,一些有趣的小功能,感兴趣的伙伴可以访问,欢迎提出更好的想法,私信沟通,网站属于静态页面) SubTopH前端开发个人站…

vite 项目搭建

1. 创建 vite 项目 npm create vite@latest 2. 安装sass/less ( 一般我使用sass ) cnpm add -D sasscnpm add -D less 3. 自动导入 两个插件 使用之后,不用导入vue中hook reactive ref cnpm install -D unplugin-vue-components unplugin-auto-import 在 vite.config.…

关闭浏览器窗口弹出提示框(vue项目)

<script> export default {name: App,mounted() { //开发环境不需要提示if (process.env.NODE_ENV development) returnthis.$nextTick(() > {window.addEventListener(beforeunload, this.beforeUnload)})},beforeDestroy() {if (process.env.NODE_ENV development…

手机自动无人直播,实景无人直播真的有用吗?

继数字人直播之后&#xff0c;手机自动直播开始火热了起来&#xff0c;因为其门槛低&#xff0c;成本低&#xff0c;一部手机一个账号就可以实现直播&#xff0c;一时深受广大商家的好评。那么&#xff0c;手机自动无人直播究竟是如何实现自动直播的呢&#xff1f; 在传统的直…

从零做软件开发项目系列之三——系统设计

前言 在与客户充分接触后取得需求调研结果&#xff0c;然后分析调研内容&#xff0c;撰写完成项目的需求规格说明书。这是一个正式的文件&#xff0c;需要供需双方签字确认。说明书中会明确需求方的要求和开发方实现的内容&#xff0c;依据需求规格说明书&#xff0c;开发方就…

uniapp踩坑合集

1、onPullDownRefresh下拉刷新不生效 pages.json对应的style中enablePullDownRefresh设置为true&#xff0c;开启下拉刷新 {"path" : "pages/list/list","style" :{"navigationBarTitleText": "页面标题名称","enable…

数据结构与算法:计算机科学的基石

文章目录 数据结构&#xff1a;构建数据的框架算法&#xff1a;问题的解决方案编程语言&#xff1a;实现数据结构的工具结论 &#x1f389;欢迎来到数据结构学习专栏~数据结构与算法&#xff1a;计算机科学的基石 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博客主页&…

Arduino之esp8266

今天&#xff0c;捣鼓了Arduino和esp8266,发现有两款比较好的软件&#xff08;Arduino IDE以及Mixly软件&#xff09;可以将程序下载至esp8266中&#xff0c;而且两者的编程语言都是一样的&#xff0c;都是基于Arduino编程语言&#xff0c;只不过一个Mixly更注重图形编程&#…

芯片验证板卡设计原理图:446-基于VU440T的多核处理器多输入芯片验证板卡

基于VU440T的多核处理器多输入芯片验证板卡 一、板卡概述 基于XCVU440-FLGA2892的多核处理器多输入芯片验证板卡为实现网络交换芯片的验证&#xff0c;包括四个FMC接口、DDR、GPIO等&#xff0c;北京太速科技芯片验证板卡用于完成甲方的芯片验证任务&#xff0c;多任务…

Pandas基础知识

文章目录 Pandas的数据结构Series --- 由数据和索引组成&#xff08;索引&#xff08;index&#xff09;在左&#xff0c;数据&#xff08;values&#xff09;在右&#xff09;DataFrame --- 索引包括行索引和列索引&#xff0c;每列数据可以是不同的类型 Pandas的索引操作 ---…

Vue路由(详解)

目录 路由原理 路由到底有什么作用&#xff1f; 路由安装和使用&#xff08;vue2&#xff09; 路由跳转 跳转实例&#xff1a; 路由的传值和取值 传值实例&#xff1a; 查询参和路由参的区别&#xff1a; 嵌套路由 嵌套实例&#xff1a; 路由守卫 守卫实例&#xff1…