【并发】Synchronized的底层原理

基本概念

Synchronized【对象锁】采用互斥的方式让同一时刻最多只有一个线程能够持有【对象锁】,如果其他线程想要获取这个【对象锁】就会被阻塞住

底层实现原理

我们可能听过,synchronized底层是通过Monitor来实现的,但如何直观的观察呢?可以通过反汇编来看一下,以下是一段简单的加锁代码

我们通过java -v 文件名.class 来反汇编一下

 可能会疑问为什么会释放两遍锁呢?是因为防止第一遍释放锁的时候会报错,导致死锁的问题,为了以防万一所以设置的释放两次锁

Monitor

Monitor被翻译成监视器,是由JVM提供的,由C++来实现,它的结构如下

当线程到来的时候,线程首先会判断Monitor中的Owner是否为空,如果为空则当前线程就会持有锁,如果不为空,那么当前线程会进入导EntryList中进行等待,此时里面的线程出于Blocked的状态,当Owner为空的时候,这些阻塞的线程就会争抢Owner;而其中的WaitSet是存储的调用wait方法的等待的线程,就是处于Waiting状态的线程

以上所说的都是浅层的Synchronized的底层原理,更深层此的还要继续往下面看

Synchronized的锁升级

Monitor实现的锁属于重量级锁,涉及到用户态(java代码)和内核态(CPU层面)的切换、进程上下文的切换,成本比较高,性能比较低

所以在JDK1.6 引入了两种新型的锁机制:偏向锁轻量级锁,他们的要引入是为了解决在没有多线程竞争或者基本没有竞争的场景下重量级锁机制带来的性能开销

要了解锁升级的流程,我们就需要先了解一下对象的内存结构

对象的内存结构

在HotSpot虚拟机中,对象在内存存储的布局可以分为三个区域,对象头、实例数据和对齐填充。其中对象头对于锁升级的关系是很大的

对象头的结构分为32位和64位,这里我们主要是介绍32位的对象头

  • hashcode:25位的对象标识Hash码
  • age:对象分代年龄占4位
  • biased lock:偏向锁标识,占1位,0表示没有开始偏向锁,1表示开启了偏向锁
  • thread:持有偏向锁的线程ID,占23位
  • epoch:偏向时间戳,占2位
  • ptr to lock record:轻量级锁状态下,指向栈中锁记录的指针,占30位
  • ptr to heavyweight monitor:重量级锁状态下,指向对象监视器Mo nitor的指针,占30位

对象是如何关联Monitor

每个Java对象都可以关联一个Monitor对象,让如果使用synchronized给对象上锁(重量级锁)之后,该对象头的Mark Word就被设置只想Monitor对象的指针,就是上文我们所提到的ptr to heavyweight monitor

轻量级锁

在很多的情况下,在Java程序运行的时候,同步块中的代码都是不存在竞争的,不同的线程交替的执行同步代码块。这种情况下,用重量级锁是没有必要的,所以JVM就引入了轻量级锁

如上述代码,obj这个对象获取了方法一和方法二两个方法的锁,如果现在来了一个线程调用了method1,之后又进入了method2,此时当前线程就进入了同样一把锁两次(重入性),由于是同一个线程所持有的锁,所有就没有必要出现锁的竞争,所以可以使用轻量级锁

下面我们介绍一下轻量级锁的执行流程

 加锁流程

  1. 在线程栈中创建一个Lock Record,将其obj字段指向锁对象
  2. 通过CAS指令将Lock Record的地址存储在对象头的mark word中,如果对象处于无锁的状态则修改成功,代表该线程获取到了轻量级锁
  3. 如果是当前线程已经持有来该锁了,代表这是一次锁的重入。设置Locak Record第一部分位null,起到一个重入计数器的作用
  4. 如果CAS失败,说明发生了竞争,此时就需要转换为欸重量级锁

解锁流程

  1. 遍历线程栈,找到所有obj字段等于当前锁对象的Lock Record
  2. 如果Lock Record的Mark Word为空,代表这是一次可重入,将obj设置为空后继续
  3. 如果Lock Record的Mard Word不为空,则利用CAS指令将对象头中的Mark Word恢复成无锁的状态,如果失败,则膨胀为重量级锁

偏向锁 

轻量级锁在没有竞争时(就自己这个线程),每次重入仍然需要执行 CAS 操作。

Java6 中引入了偏向锁来做进一步优化:只有第一次使用 CAS 将线程 ID 设置到对象的 Mark Word 头,之后发现这个线程 ID 是自己的就表示没有竞争,不用重新 CAS。以后只要不发生竞争,这个对象就归该线程所有,由此可以知道偏向锁的性能比轻量级锁的性能还要好

我们可以看一下偏向锁的内存结构:

它是由biased lock偏向锁标识,占1位,0表示没有开始偏向锁,1表示开启了偏向锁来表示的

下面我们介绍一下偏向锁的执行流程

锁是如何升级的呢

Java中synchronized有偏向锁、轻量级锁、重量级锁三种形式,分别对应了锁只被一个线程持有、不同线程交替持有、多个线程竞争锁的三种情况了

所以一旦锁发生了竞争,锁就会升级为重量级锁 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一起来露营吧!2024COSP上海国际户外展带您逃离城市,尽享夏日美好~

夏日,清空,微风 宜在湖畔撒欢,宜在山野放松 宜露营、听音乐、感受自然 初夏时节,微风不燥,最适合露营啦! 一块绿地,一顶帐篷,一片安静的湖 在如茵绿地上,躺进初夏里 …

同一浏览器不同用户登录覆盖问题

同一浏览器使用的 Cookie 是相同的,第二个用户登录时,将会覆盖第一个用户的登录信息。不能存放在 Cookie 内,这样不能唯一区分用户,所以将Cookies改成localStorage import Cookies from js-cookieconst TokenKey Admin-Tokenexp…

DNS域名

DNS域名 DNS是域名系统的简称 域名和ip地址之间的映射关系 互联网中,ip地址是通信的唯一标识 访问网站,域名,ip地址不好记,域名朗朗上口,好记。 域名解析的目的就是为了实现,访问域名就等于访问ip地址…

代码随想录算法训练营Day15|102.二叉树的层序遍历 226.翻转二叉树 101.对称二叉树

102.二叉树的层序遍历 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right)…

企业建设数字工厂管理系统该如何选择供应商

随着信息技术的飞速发展,数字化转型已成为企业提升竞争力的关键。在制造业领域,建设数字工厂管理系统更是实现智能化生产、优化资源配置、提高生产效率的重要途径。然而,面对市场上琳琅满目的数字工厂管理系统供应商,企业改如何选…

TCP协议的核心机制

TCP协议的核心机制 一:确认应答机制1.2:超时重传接收缓冲区 超时重传时间重置连接 一:确认应答机制 对于TCP协议来说,要解决的一个很重要的问题,就是可靠传输 可靠传输,不是指发送方能够100%的把数据发送给接收方,而是尽可能. 尤其是让发送方知道,接收方是否收到. 举个例子: …

Spring Boot 应用打 WAR 包后无法注册到 Nacos怎么办

你好,我是柳岸花开。 在微服务架构中,服务注册与发现是至关重要的一环。Nacos 作为阿里巴巴开源的注册中心,能够很好地满足这一需求。然而,在将 Spring Boot 应用打包成 WAR 部署到外部服务器时,可能会遇到服务无法注册…

实用软件分享---- i茅台 在windows上自动预约和自动获取小茅运的软件

专栏介绍:本专栏主要分享一些实用的软件(Po Jie版); 声明1:软件不保证时效性;只能保证在写本文时,该软件是可用的;不保证后续时间该软件能一直正常运行;不保证没有bug;如果软件不可用了,我知道后会第一时间在题目上注明(已失效)。介意者请勿订阅。 声明2:本专栏的…

基于JS实现《国家基本比例尺地形图分幅和编号》标准

1、标准 GB T 13989-2012国家基本比例尺地形图分幅和编号 地址:【高清版】GB T 13989-2012国家基本比例尺地形图分幅和编号 - 道客巴巴 2、1:100万比例尺 2.1 说明 2.2 计算公式 2.3 计算代码 2.3.1 元素数据定义 由于中国只到N层,所以只定义到O. …

自动控制:控制系统的灵敏度分析

自动控制:控制系统的灵敏度分析 引言 灵敏度问题在控制系统设计中至关重要。灵敏度衡量的是系统对参数变化和扰动的响应程度。本文将详细探讨灵敏度函数的概念,并推导出开环和闭环控制系统在前向路径和反馈路径元素扰动下的灵敏度表达式。 灵敏度概念…

8款监控电脑屏幕的软件排名(屏幕监控软件TOP8)

8款监控电脑屏幕的软件排名(屏幕监控软件TOP8) 作为企业管理者都想对企业的员工和电脑设备了如指掌,毕竟日防夜防家贼难防,利用电脑泄密者数不胜数,为此需要对电脑屏幕实施监控,小编为你推荐几个屏幕监控软…

vue3中 window绑定scroll事件滚动页面获取不到e.target.scrollTop

遇到的问题 vue3项目 onMounted(() > {window.addEventListener(scroll, (e) > {console.log(e.target.scrollTop)}) })想要监听页面中的滚动,然后获取滚动距离实现一些功能,发现event参数中获取不到e.target.scrollTop(印象中以前使…

Java Web学习笔记2——Web开发介绍

什么是Web? Web:全球广域网,也称为万维网(WWW World Wide Web),能够通过浏览器访问的网站。 1)淘宝、京东、唯品会等电商系统; 2)CRM、OA、ERP企业管理系统&#xff1…

Wi-Fi 6E vs. Wi-Fi 7: Which is the Best Fit for Your Infrastructure?

Wi-Fi 6E vs. Wi-Fi 7: Which is the Best Fit for Your Infrastructure? With the rapid advancement of wireless technology, organizations face a critical decision: should they adopt Wi-Fi 6E now or wait for Wi-Fi 7? This decision impacts various aspects of …

isp效果库相关参数——镜像翻转

前言 之前一直比较忙着接触新工作内容,所以有一段搁置期,但是工作中的知识点还是有一直记录的,只是没空发出来,毕竟需要先熟悉才能总结内容,接下来的几天会连着发布 不同的产品数据手册有着不同的叫法但是统一的意思离…

【成品设计】基于IAP15W4K的久坐提醒器

《基于IAP15W4K的久坐提醒器》 整体功能: 作品名称:《基于IAP15W4K61S4的久坐提醒器》 作品器件: 单片机:IAP15W4K61S4 2.人体感应模块: 引脚连接: 1.VCC:正极 3.3-5V供电 2.GND:…

为什么要选择软件开发外包?降本增效共创共赢

►开发外包是什么? 软件开发外包就是将企业的软件开发项目交给外部的专业团队或个人来完成,这些外包团队通常具备丰富的技术经验和专业的开发能力,能够根据企业的需求,提供定制化的软件开发服务。通过外包,企业可以节…

FarmersWorld农民世界源码开发:0撸卷轴+潮玩模式

一、引言 随着科技的发展,游戏产业日益壮大,一种新型的游戏形式——零撸游戏应运而生。本文将深入探讨FarmersWorld农民世界源码开发,以其独特的0撸卷轴潮玩模式,为玩家带来全新的游戏体验。 二、源码开发的专业性和深度 Farmer…

会声会影2024官方旗舰版最新版评测

随着数字内容创作的兴起,越来越多的人开始关注视频制作领域。对于初学者和专业人士来说,选择一款适合自己的视频编辑软件是非常重要的。今天,我将为大家全面而深入地评测会声会影2024最新版,从易用性、功能性以及性价比方面进行评…

2022.9.26DAY678

课程学习:《数据处理技术》讲了“数据查询”的语法格式,语法格式也算是简单,就是没能跟之前的内容联系起来,之前的内容没有及时回顾。 高等数学:“ 函数的概念”,讲了函数的概念,反函数&#…