Synchronized底层机制:偏向锁、轻量级锁与重量级锁及其锁升级过程

news2024/11/16 17:56:55

前言:

在Java并发编程中,synchronized关键字是用于实现线程同步的重要工具。在JVM中,synchronized的底层实现涉及到了偏向锁、轻量级锁和重量级锁这三种锁状态,以及锁升级过程。在之前的文章中介绍到过,这篇文章详细对锁升级进行说明。

在这里插入图片描述

偏向锁

偏向锁是Java 6中引入的一种优化手段,它的核心思想是:如果一个线程获得了锁,并且没有释放,那么下次当这个线程再次尝试获得这个锁的时候,不需要做任何同步操作,不需要进行CAS操作或者阻塞,可以直接获得这个锁。偏向锁主要是为了避免无竞争情况下的同步原语,进一步提高程序的运行性能。

如何获取偏向锁

当一个线程首次访问同步块并获取锁时,会在对象头和栈帧中的锁记录里存储偏向的线程ID。

在后续操作中,如果这个线程再次尝试获得这个锁,JVM只需检查对象头的Mark Word里是否存储着指向当前线程的偏向锁。如果是,就表示线程已经获得了锁,可以继续执行同步代码块。

如何撤销偏向锁

当一个线程释放偏向锁时,JVM并不会立即清除对象头中的偏向线程ID,而是将其设置为一个特殊值,表示该锁已经被释放。这样,当其他线程尝试获取这个锁时,JVM会检测到这个特殊值,从而知道该锁已经被释放,可以重新进行偏向锁的获取操作。
在这里插入图片描述

轻量级锁

轻量级锁是为了减少获得锁和释放锁所带来的性能消耗而引入的。在锁竞争不激烈的情况下,轻量级锁可以提高程序的性能。它的实现主要依赖于自旋和CAS操作。

如何轻量级锁

当线程尝试获取一个被其他线程持有的轻量级锁时,它会进入自旋状态,尝试通过CAS操作获取锁。如果自旋等待超过预定的次数仍然没有成功获得锁,那么该线程将会被挂起,转换为重量级锁。在Java 6之后,对于非偏向锁的同步块,在第一次被访问时也会尝试使用轻量级锁。

如何轻量级锁

轻量级锁的释放过程相对简单。当持有锁的线程释放锁时,只需将对象头中的Mark Word设置为无锁状态即可。这样,其他线程就可以尝试获取这个轻量级锁了。

重量级锁

重量级锁是传统的同步锁实现方式,它在JVM中是通过对象监视器Monitor来实现的。当一个线程尝试获取一个被其他线程持有的重量级锁时,它会被阻塞并放入锁的等待队列中。

当持有锁的线程释放锁时,等待队列中的一个线程会被唤醒并获得锁。这种实现方式虽然保证了线程安全,但是在竞争激烈的情况下会导致大量的线程切换和上下文切换,从而带来较大的性能开销。

锁升级过程

接下来详细介绍一下锁升级的过程,这块也是面试中的重点!

在JVM中,synchronized的底层实现涉及到了偏向锁、轻量级锁和重量级锁这三种锁状态的转换过程,即锁升级过程。

当一个线程首次访问同步块并获得锁时,该锁的状态为偏向锁。

在后续的操作中,如果该线程再次尝试获得这个锁,JVM会检查该锁的状态并进行相应的处理。如果该锁的状态为偏向锁且偏向的线程ID与当前线程的ID相同,则表示该线程已经获得了锁,可以继续执行同步代码块;如果该锁的状态为偏向锁但偏向的线程ID与当前线程的ID不同,则表示该锁已经被其他线程持有,需要进行竞争。

此时,JVM会将该锁的状态升级为轻量级锁或重量级锁,具体取决于竞争的激烈程度。如果竞争不激烈,JVM会尝试使用CAS操作获取轻量级锁;如果竞争激烈或自旋等待超过预定的次数仍然没有成功获得轻量级锁,则将该锁的状态升级为重量级锁并阻塞当前线程放入等待队列中等待唤醒。

当持有锁的线程释放锁时也会根据当前锁的状态进行相应的处理。如果当前锁的状态为重量级则唤醒等待队列中的一个线程并获得锁;如果当前锁的状态为轻量级或偏向则只需将对象头中的Mark Word设置为无锁状态即可。

同时也祝愿各位小伙伴儿在面试的过程中这块知识点答得都对,看完全会!

文章到这里就先结束了,感兴趣的可以订阅专栏哈,后续会继续分享相关的知识点。

在这里插入图片描述

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

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

相关文章

【攻防世界-misc】[简单] 凯撒大帝在培根里藏了什么

1.下载文件,打开后是这样子的 2.根据题目提示说是有凯撒密码和培根密码,因为文件内容为AB形式,不符合凯撒条件,所以先用培根解,将文件内容复制,CTF在线工具-CTF工具|CTF编码|CTF密码学|CTF加解密|程序员工具…

使用Golang构建高性能网络爬虫

目录 一、Golang的特点 二、构建网络爬虫的步骤 三、关键技术和注意事项 使用协程进行并发处理 使用通道进行协程间的通信 合理控制并发数和处理速度 遵守网站使用协议和法律法规 防止被网站封禁或限制访问 优化网页解析和数据处理 异常处理和错误处理 日志记录和监控…

chrome vue devTools安装

安装好后如下图所示: 一:下载vue devTools 下载链接https://download.csdn.net/download/weixin_44659458/13192207?spm1001.2101.3001.6661.1&utm_mediumdistribute.pc_relevant_t0.none-task-download-2%7Edefault%7ECTRLIST%7EPaid-1-13192207…

Java实现飞翔的鸟小游戏

Java实现飞翔的鸟小游戏 1.准备工作 创建一个新的Java项目命名为“飞翔的鸟”,并在src中创建一个包命名为“com.qiku.bird",在这个包内分别创建4个类命名为**“Bird”、“BirdGame”、“Column”、“Ground”,并向需要的图片**素材导入…

运行启动vue项目报报错node: --openssl-legacy-provider is not allowed in NODE_OPTIONS解决

报错的问题就是package.json中的Scripts下的dev 解决方法就是要不升级你的应用代码,支持 新版本的node.js 要不就是删除SET NODE_OPTIONS--openssl-legacy-provider &&代码,如下代码即可正常运行起来

还在愁没项目?来瞧瞧这些另类赚钱方式

客套话不多说,直接上案例,这些都是正儿八经的真实案例,相信大家通过这些人的案例自然能摸索整理出一套属于自己的项目!摸索不出,也多多少少能受一些灵感上的启发。 小A是长期混B站的,大家称他为“B站搬运工…

echarts图表显示不全

图表显示是显示了,但是没有展示全部,一看控制台div的高度只有1px了,手动修改高度也只是拉伸图表,并没有按规定的尺寸展示 随之开始思考为什么呢 ? ? ? 因为 Echarts 的依赖是惰性的,需要手动设置resize&#xff0…

【Openstack Train安装】十三、创建实例

在先前的教程中,介绍了安装openstack及其相关组件的具体过程,本文介绍如何创建实例并完成访问。 在按照本教程操作之前,请确保完成以下配置: 【Openstack Train安装】一、虚拟机创建 【Openstack Train安装】二、NTP安装 【Op…

ubuntu0.22.04.1安装mysql8.0及root密码注意

先看一下你的安装包是什么版本 apt list |grep mysql基本都是默认的8.0版本,然后安装: apt-get install mysql-server-8.0安装以后 ,mysql默认启动; 一般root 是没有密码的,在本地直接回车登录 我们看一下密码插件 …

Java系列-new Object的过程

从《深入理解Java虚拟机》里面的第七章看到了一些,先简单记录一下,好多不懂的。 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载7个阶段。其中验证…

37.从0到上线三天搭建个人网站(第一天)

点赞收藏加关注,你也能住大别墅! 挑战三天搭建个人网站 从0到上线 一、项目的主要功能 1.作为自己在网上的一个工作室。 2.发帖 3.展示个人项目连接 4.介绍自己(没准儿还能接点活儿) 二、UI风格参考 三、技术选型 1.前端&a…

宋仕强论道之华强北自组织和激励模式(十四)

宋仕强论道之华强北自组织和激励模式(十四): 为什么一个小小深圳市华强北我宋仕强就讲这么久呢,听说玄奘大和尚刚出道时在洛阳的白马寺讲经,一个“悟”字就讲了三个月。一个事物有他的复杂性和多样性,从自然科学和社会…

STM32CubeMX HAL F405 TIM1输出多路不同频率及占空比的方波(PWM)(输出比较模式)

TIM1_CH1 TIM1_CH1N TIM1_CH2 TIM1_CH2N TIM1_CH3 TIM1_CH3N TIM1_CH4 TIM1的通道1、2、3输出同频率(20KHz)的PWM波形(占空比50%) TIM1的通道1输出100Hz的PWM波形(占空比50%) #include "tim.h"/* USER CODE BEGIN 0 */ uint16_t f1 100;…

科聪停车移动机器人整体解决方案!

停车机器人是用于在停车场或车库等场所中进行车辆的自动停放和取车操作。随着智能交通和智能城市的发展,停车机器人在解决停车难、提高停车效率和减少停车空间浪费等方面具有广阔的应用前景。 科聪停车机器人解决方案: 本方案中核心部分采用的是科聪通用…

DC电源模块的基本工作原理和应用

BOSHIDA DC电源模块的基本工作原理和应用 DC电源模块是一种能够将交流电转化为直流电的电子装置。它的基本工作原理是利用变压器、整流桥、电容滤波、电压稳定器等电路组成,将输入的交流电转换为稳定的直流电输出。这种直流电源模块通常可以提供不同的电压和电流输…

一觉醒来!Keras 3.0史诗级更新,大一统深度学习三大后端框架【Tensorflow/PyTorch/Jax】

不知道大家入门上手机器学习项目是首先入坑的哪个深度学习框架,对于我来说,最先看到的听到的就是Tensorflow了,但是实际上手做项目开发的时候却发现了一个很重要的问题,不容易上手,基于原生的tf框架来直接开发模总是有…

MySQL之redo log

聊聊REDO LOG 为什么需要redolog? 那redolog主要是为了保证数据的持久化,我们知道innodb存储引擎中数据是以页为单位进行存储,每一个页中有很多行记录来存储数据,我们的数据最终是要持久化到硬盘中,那如果我们每进行…

优思学院|六西格玛质量管理如何提升顾客满意度?

顾客满意度是一种无价的商品,它必须被赢得。 近年来,人们对于顾客满意度与企业的财务业绩之间的关系越来越关注,顾客满意之所以会如此持久地引起人们的强烈关注,是因为人们认为顾客满意能为企业带来较强的市场竞争优势和更高的市…

【攻防世界-misc】[简单] 简单的base编码

1.下载并打开文件 2.由于题目说的是base编码,就用base在线工具解码,多次尝试后是base64编码,但由于这个文件内容太多了,所以需要多次(18次)解码才可以获得flag值。 CTF在线工具-在线base编码|在线base解码…

【网络奇缘】- 计算机网络|分层结构|深入学习ISO模型

🌈个人主页: Aileen_0v0🔥系列专栏: 一见倾心,再见倾城 --- 计算机网络~💫个人格言:"没有罗马,那就自己创造罗马~" 回顾链接:http://t.csdnimg.cn/nRRzR 这篇文章是关于深入学习OSI模型七层结构, “书山…