线程安全-1 synchronized锁升级

一.说一下synchronized关键字的底层原理

1.synchronized又叫同步锁,采用互斥的方式使同一时刻只能有一个线程持有锁。

2.jdk1.6及以前,synchronized底层是用monitor实现的。monitor是jvm级别的对象,由c++实现。每一个对象对应一个monitor,线程要获取锁需要通过一个对象去关联其monitor,由这个对象来充当锁介质,因此又叫对象锁。

3.monitor由三部分组成

(1)owner:关联当前持有锁的线程。同一时刻只能有一个线程持有锁。

(2)EntryList:关联所有没有竞争到锁的线程。当一个线程释放锁,会唤醒EntryList中所有线程一起争抢锁,与阻塞的先后顺序无关,因此是一种非公平锁。

(3)WaitSet:关联所有持有锁后调用wait()进入等待状态的线程,这些线程进入等待状态后会释放锁,等待被唤醒。

二.线程获取锁是如何通过对象关联monitor的?

1.在HotSpot虚拟机中,对象在内存的存储可分为三部分:

(1)对象头Header:Header又分为两部分

        a.MarkWord:存储对象自身运行时的数据,如HashCode、分代年龄、锁标识等。

        b.KlassPoint:存储指向对象数据类型的指针。

        c.如果对象是一个数组,则还会有第三部分存储数组的长度。

(2)实例数据InstanceData:存储对象数据,如成员变量等。

(3)填充数据PaddingData:如果对象头加实例数据的长度不是8的整数倍,则会用填充数据填到8的整数倍,为无意义数据。

2.Java中每个对象会关联一个Monitor对象,如果当前线程使用synchronized给对象上锁,且是重量级锁,则该对象的MarkWord会存储指向其Monitor对象的指针,线程通过该指针关联到其Monitor。

三.Monitor实现的锁是重量级锁,说一下锁升级机制

1.synchronized实现的锁都是可重入的,锁的状态可分为四种:

(1)无锁

        a.对象未被synchronized上锁,则是无锁状态。

        b.MarkWord存对象的HashCode、分代年龄、偏向锁标识、锁状态。

(2)偏向锁

        a.很长一段时间内,该锁只会被一个线程使用,则使用偏向锁。

        b.对于偏向锁,线程第一次上锁会通过CAS操作使对象的MarkWord关联线程id,后续线程对该锁的每次重入都只要比较线程id即可,无需再进行CAS操作。即多次重入仅进行一次CAS操作。

        c.MarkWord存锁关联的线程id、时间戳epoch、分代年龄、偏向锁标识、锁类型标识。

(3)轻量级锁

        a.如果该锁被多线程使用,但不同线程的加锁时间基本是错开的,即多线程对于锁的竞争不激烈,则使用轻量级锁。

        b.对于轻量级锁,线程第一次上锁会通过CAS操作使对象的MarkWord关联线程的锁记录路,后续的每次重入也要进行CAS操作,即每次重入都要进行一次CAS操作。

        c.MarkWord存 指向线程栈中锁记录的指针、锁类型标识。

(4)重量级锁

        a.如果该锁被多线程竞争使用,则使用重量级锁。

        b.重量级锁是通过Monitor实现的,而Monitor是jvm层面的对象,而jvm又是系统级别的,属于内核态。因此每次操作锁都要涉及到用户态和内核态的切换、进程上下文的切换,成本高性能低。

        c.MarkWord关联 指向Monitor对象的指针、锁类型标识。

2.锁升级机制

(1)对象被创建出来,未被synchronized加锁,此时属于无锁状态。

(2)当线程第一次执行到synchronized代码块,给对象加锁,此时无锁升级为偏向锁,意为偏向于第一个加锁的线程的锁。若一直只有该线程使用该锁,则该锁一直是偏向锁。

(3)当锁是偏向锁时,如果被其他线程访问,则偏向锁升级为轻量级锁。轻量级锁情况下,未竞争到锁的线程不会进入阻塞,而是会进入自旋。

自旋:线程不断重复未成功的操作,直至成功。若一直未成功,则一直重复失败操作,直至成功为止,因此又称为自旋锁

(4)当轻量级锁中的某个线程自旋次数达到设置的最大自旋次数时,表明锁竞争激烈,此时轻量级锁升级为重量级锁。

轻量级锁情况下:若线程未竞争到锁,不会释放cpu,而是会自旋,空耗cpu时间片,直到成功竞争到锁。

重量级锁情况下:若线程未竞争到锁,则进入阻塞,释放cpu。;当锁被释放时,由操作系统唤醒该线程。

上述四种状态随着锁竞争的激烈程度不断升级,构成锁的升级。锁的升级是不可逆的,只能升级不能降级。

     

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

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

相关文章

9.1 Go语言入门(环境篇)

Go语言入门(环境篇) 目录一、什么是Go语言二、下载安装配置Go语言开发环境1. 下载2. 安装3. 配置环境变量4. 安装环境验证 三、 开发工具1. 下载2. 安装3. 激活4. 配置SDK 四、 创建go工程文件并运行1. 创建go工程2. 示例代码3. 运行代码 目录 一、什么…

软件开源协议与QT的开源协议介绍

一.常见的六种开源协议 1.BSD协议 BSD协议全称为“Berkely Software Distribution”,中文译为“伯克利软件发行版”。其最早用于伯克利UNIX操作系统上的开源贡献。 主要特点: 允许修改源码 允许源码再发布 允许商业软件发布和销售 约束&#xff1…

shell 脚本笔记2

3.env与set区别 env用于查看系统环境变量 set用于查看系统环境变量自定义变量函数 4.常用环境变量 变量名称含义PATH命令搜索的目录路径, 与windows的环境变量PATH功能一样LANG查询系统的字符集HISTFILE查询当前用户执行命令的历史列表 Shell变量:自定义变量 目标…

HCIP【VRRP、MSTP、VLAN综合实验】

目录 一、实验拓扑图: ​编辑二、实验要求 三、实验思路 四、实验步骤 (1) eth-trunk技术配置 (2)vlan 技术配置 (3)配置SW1、SW2、AR1、ISP的IP地址 (4)在交换机…

FBB-Frontiers in Bioengineering and Biotechnology

文章目录 一、期刊简介二、征稿信息三、期刊表现四、投稿须知五、投稿咨询 一、期刊简介 Frontiers in Bioengineering and Biotechnology是专注生物工程和生物技术领域的开放获取期刊。 研究范围涵盖生物材料、生物力学、生物工艺工程、生物安全和生物安保,生物传…

QT项目-欢乐斗地主游戏

QT项目-欢乐斗地主游戏 游戏概述游戏规则牌型牌型的大小游戏角色游戏规则游戏的胜负游戏计分规则 游戏相关的类介绍卡牌类玩家类窗口类游戏控制类游戏策略类线程类音频类 游戏主要组件卡牌玩家窗口 游戏控制源码 游戏概述 游戏规则 不同地域游戏规则可能有些许差异&#xff0c…

MySQL之Schema与数据类型优化(三)

Schema与数据类型优化 BLOB和TEXT类型 BLOB和TEXT都是为存储很大的数据而设计的字符串数据类型,分别采用二进制和字符方式存储。 实际上它们分别属于两组不同的数据类型家族:字符类型是TINYTEXT,SMALLTEXT,TEXT,MEDIUMTEXT,LONG…

Spring Cloud整合Sentinel

1、引入依赖 链接: 点击查看依赖关系 父pom <spring.cloud.version>Hoxton.SR12</spring.cloud.version> <spring.cloud.alibaba.version>2.2.10-RC1</spring.cloud.alibaba.version>Sentinel应用直接引用starter <dependency><groupId&…

【UE5.1】* 动画重定向 (让你的角色可以使用小白人全部动画)

前言 这里以小白人动画重定向给商城资产“Adventure Character”中的角色为例&#xff0c;阐述如何使用UE5.1进行动画重定向。 步骤 1. 创建一个IK绑定 这里选择小白人的骨骼网格体 这里命名为“IKRig_Mannequin” 2. 再新建一个IK绑定&#xff0c;这里使用你要替换给的角色…

MyBatis入门——MyBatis XML配置文件(3)

目录 一、配置连接字符串和MyBatis 二、写持久层代码 1、添加 mapper 接口 2、添加 USerInfoXmlMapper.xml 3、测试类代码 三、增删改查操作 1、增&#xff08;Insert&#xff09; 返回自增 id 2、删&#xff08;Delete&#xff09; 3、改&#xff08;update&#xf…

软考--试题六--中介者模式(Mediator)

中介者模式(Meditor) 意图 用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用&#xff0c;从而使其耦合松散&#xff0c;而且可以独立地改变它们之间的交互 结构 适用性 1、一组对象以定义良好但是复杂的方式进行通信&#xff0c;产生的相互依赖关…

民国漫画杂志《时代漫画》第17期.PDF

时代漫画17.PDF: https://url03.ctfile.com/f/1779803-1248612629-85326d?p9586 (访问密码: 9586) 《时代漫画》的杂志在1934年诞生了&#xff0c;截止1937年6月战争来临被迫停刊共发行了39期。 ps:资源来源网络&#xff01;

力扣HOT100 - 1143. 最长公共子序列

解题思路&#xff1a; 动态规划 class Solution {public int longestCommonSubsequence(String text1, String text2) {int m text1.length(), n text2.length();int[][] dp new int[m 1][n 1];for (int i 1; i < m; i) {char c1 text1.charAt(i - 1);for (int j 1…

深度学习之基于YoloV5的动物识别系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与目标 在生态研究、动物保护、以及畜牧业等多个领域&#xff0c;对动物进行准确、高效的识别都具有重…

形态学操作:腐蚀、膨胀、开闭运算、顶帽底帽变换、形态学梯度区别与联系

一、总述相关概念 二、相关问题 1.形态学操作中的腐蚀和膨胀对图像有哪些影响&#xff1f; 形态学操作中的腐蚀和膨胀是两种常见的图像处理技术&#xff0c;它们通过对图像进行局部区域的像素值替换来实现对图像形状的修改。 腐蚀操作通常用于去除图像中的噪声和细小的细节&a…

单链表oj

练习 1. 删除val节点 oj链接 这道题最先想出来的方法肯定是在遍历链表的同时删除等于val的节点&#xff0c;我们用第二中思路:不等于val的节点尾插&#xff0c;让后返回新节点。代码如下&#xff1a; struct ListNode* removeElements(struct ListNode* head, int val) {str…

XML基础知识

1. 常见配置文件类型 properties文件,例如druid连接池就是使用properties文件作为配置文件 XML文件,例如Tomcat就是使用XML文件作为配置文件 YAML文件,例如SpringBoot就是使用YAML作为配置文件 json文件,通常用来做文件传输&#xff0c;也可以用来做前端或者移动端的配置文件…

软考高级-信息系统项目管理师案例题选择题做题总结

1.不应该只会建立变更和配置管理的规则&#xff0c;应该建立变更控制流程 2.变更的影响不应该只由工程师评估 3.没有对变更和修改进行记录 4.变更完成后&#xff0c;客户没有对变更进行验证 5.变更没有通知相关人员 6.变更没有和配置管理关联 7.项目变更管理的工作流程&#xf…

SOLIDWORKS科研版的介绍

SOLIDWORKS科研版的介绍 针对研究项目充分利用软件功能&#xff0c;无任何限制访问有关工程和科学的最新技术&#xff0c;并与世界各地的其他用户进行交流。 SOLIDWORKS科研版可为研究人员提供有关 SOLIDWORKS 设计和科学工程技术的最新知识&#xff0c;并使他们与世界范围内的…

08.CNN

文章目录 Observation 1Pooling - Max PoolingFlattenApplication&#xff1a;Playing Go使用验证集选择模型食物分类 Observation 1 Pooling - Max Pooling Pooling主要为了降低运算量&#xff0c;现在一般不用了&#xff0c;全convolution Flatten Application&#xff1a;P…