Java面试八股之Synchronized锁升级的原理

  1. Synchronized锁升级的原理

Synchronized锁升级是Java为了提高并发性能而引入的一项优化措施,这一机制主要发生在JDK 1.6及之后的版本中。Synchronized锁升级旨在减少锁带来的性能开销,通过从低开销的锁逐步升级到高开销的锁,以适应不同的竞争场景。其基本原理涉及四个阶段:无锁、偏向锁、轻量级锁和重量级锁。

无锁状态:初始时,对象头中并没有任何锁的信息,对象处于无锁状态。

偏向锁(Biased Locking):

目标是消除数据竞争较少情况下的同步开销。当第一个线程访问同步块并获取锁时,JVM会将其标记为偏向锁,并将锁标记为这个线程ID。

在随后的访问中,如果仍然是这个线程请求锁,只需检查对象头中的线程ID即可,无需执行加锁操作,这大大提升了性能。

偏向锁可以被撤销,如果其他线程尝试获取这个锁,偏向锁会升级到轻量级锁。

轻量级锁:

当有第二个线程尝试竞争偏向锁时,偏向锁升级为轻量级锁,此时会尝试使用CAS操作(Compare and Swap)来避免线程阻塞。

竞争线程会尝试将自己线程的锁记录(存放在栈帧中)与对象头中的Mark Word交换,如果成功,则获取到锁,失败则自旋等待。

自旋是指线程在原地循环等待锁的释放,而不是立即挂起,减少了线程上下文切换的开销。

若自旋达到一定次数仍未获取到锁,轻量级锁会升级到重量级锁。

重量级锁:

当多个线程持续竞争,自旋不会带来收益时,锁升级为重量级锁,此时会使用操作系统的互斥量(mutex)来实现线程阻塞与唤醒。

这一阶段会涉及线程状态的转换和操作系统级别的上下文切换,开销较大,但能有效处理高度竞争的场景。

锁升级的过程是不可逆的,一旦升级到重量级锁,就不会再降级回轻量级锁或偏向锁。理解锁升级机制的关键在于认识到它是根据竞争情况动态调整的,以最小化同步操作的性能影响。在回答时,可以强调这一机制如何根据实际的竞争程度逐渐增加锁的复杂度,以平衡性能与安全需求。

 如果大家需要视频版本的讲解,欢迎关注我的B站:

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

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

相关文章

I/O '24|学习资源焕新,技术灵感升级

2024 年 5 月 15 日凌晨举行的 Google I/O 大会为各地的开发者们带来了新的灵感。面对技术革新,相信各位开发者们都迫不及待想要自己上手试一试。 别急,Google 谷歌今年为中国的开发者们准备了一份特别的学习资源,让开发者们自由探索新知。 G…

什么是数字签名,数字签名详解。

数字签名详解 数字签名是一种用于验证数字信息的真实性和完整性的技术,广泛应用于电子商务、软件分发、合同签署等领域。它通过加密技术确保信息在传输过程中未被篡改,并确认发送者的身份。以下是对数字签名的详细介绍。 一、数字签名的基本概念 数字…

蓝桥杯2023(十四届)省赛——岛屿个数(DFS+BFS)

岛屿个数(DFSBFS) 1.岛屿个数 - 蓝桥云课 (lanqiao.cn) **法一:**本题很妙啊,你发现没有。反向操作,不是直接算岛屿数量,而是先将最外层的海洋给标注出来(DFS,visit[i][j]2&#x…

笔记-python有三种导入模块的方法

其一, import modname : 模块是指一个可以交互使用,或者从另一Python 程序访问的代码段。只要导入了一个模块,就可以引用它的任何公共的函数、类或属性。模块可以通过这种方法来使用其它模块的功能。 用import语句导入模块,就在…

NAT简介

一、NAT 概念定义 NAT(Network Address Translation,网络地址转换)是一种将私有 IP 地址转换为公有 IP 地址的技术。 允许一个组织内部使用私有 IP 地址的网络通过少量的公有 IP 地址连接到互联网。实现了私有网络与外部网络的通信&#xf…

Angular安装与基础语法

安装Angular cli npm i -g angular-cli 创建项目 npm new project_name(项目名称) 启动项目 cd project_name(j进入新创建的项目) ng serve --open 创建组件 ng g c xxx 会在根组件的统计生成一个组件xxx文件夹,比如ng g c hello 就会生成一个hello组件文件…

夜骑,是探索城市的另一种维度,是与自我对话的静谧时光

月光下的骑行浪漫主义者 想象一下,当白日的喧嚣退去,城市的霓虹开始闪烁,你跨上心爱的自行车,迎着凉爽的晚风,穿梭于灯火阑珊之中。夜骑,不仅仅是一场运动,更是一种逃离日常、探索未知的冒险。但…

【Ambari】Docker 安装Ambari 大数据单机版本

目录 一、前期准备 1.1 部署 docker 1.2 部署 docker-compose 1.3 版本说明 二 、镜像构建启动 2.1 系统镜像构建 2.2 安装包源镜像构建 2.3 kdc镜像构建 2.4 集群安装 2.5 容器导出为镜像 三、Ubuntu环境安装测试 3.1 环境准备 3.2 集群容器启动 一、前期准备 1.…

git多人开发,不用merge的操作方法,阿里codeup

阿里云效 Codeup 是阿里云提供的一款代码托管平台,它集成了代码仓库管理、代码审查、持续集成等功能,非常适合团队协作开发。 通过 Codeup 的合并申请(Merge Request,MR)功能,可以方便地进行代码合并和审查…

如何在OrangePi AIpro智能小车上实现安全强化学习算法

随着人工智能和智能移动机器人的广泛应用,智能机器人的安全性和高效性问题受到了广泛关注。在实际应用中,智能小车需要在复杂的环境中自主导航和决策,这对算法的安全性和可靠性提出了很高的要求。传统的强化学习算法在处理安全约束时存在一定…

享受当下,还是留待未来?一项fMRI与眼动追踪技术的联合研究

摘要 时间贴现(temporal discount)是指个体对奖励的估计会随着时间流逝而下降的心理现象。具体而言,当获得奖励的时间以日期(日期条件;例如,2023年6月8日)而不是延迟(延迟条件;例如,30天)呈现时,贴现率较低…

免费,Python蓝桥杯等级考试真题--第14级(含答案解析和代码)

Python蓝桥杯等级考试真题–第14级 一、 选择题 答案:B 解析:键为‘B’对应的值为602,故答案为B。 答案:A 解析:字典的符合为花括号,先键后值,故答案为A。 答案:C 解析&#xff1a…

Stable Diffusion 字体和场景结合【把四季藏在海里】

把四季藏在海里,话不多说,上教程。 一、花瓣找字 打开花瓣找下字,也可以自己做,我不会,谢谢。本文用到的字,版权归原作者所有。 白底黑字:那么就是浪花占主要部分,字就是海的效果&…

【改进】YOLOv8 AND YOLOv9 总目录

说明:本专栏为YOLOV8和YOLOV9的使用以及改进的方法。平时比较忙,只能随缘回答问题哈,谨慎订阅! 💛 💙 💜 ❤️ 💚 💛 💙 💜 ❤️ 💚 &…

sdut java lab 7.1(法二好理解)

7-1 sdut-JAVA-Pig Latin 分数 12 全屏浏览 切换布局 作者 马新娟 单位 山东理工大学 Write a program that requests a word as input, translates the word into Pig Latin and outputs the word input and its equivalent in Pig Latin. The rules for translating a …

C++:STL容器的学习-->string

C:STL容器的学习-->string 1. 构造方法2. string的赋值操作3. string字符串的拼接4. string 查找和替换5. string字符串的比较6. string字符存取7. string 插入和删除8. string截取 需要添加头文件#include <string> 1. 构造方法 string() 创建空的字符串 string(c…

Cordova 环境部署,将 H5 打包为 Android App

Cordova 环境部署&#xff0c;将 H5 打包为 Android App 一、环境配置 1、JDK 环境变量 JAVA_HOME%JAVA_HOME%\bin 2、Android SDK 环境变量 ANDROID_HOMEANDROID_SDK_ROOT%ANDROID_HOME%\build-tools%ANDROID_HOME%\tools%ANDROID_HOME%\platform-tools 3、Node 环境…

C++学习/复习6---内存管理(数据的位置/大小)/new、delete/内存相关面试题(malloc与new/内存泄漏)

一、内存中区域 1.不同数据的存储位置 2.数据占用内存大小 二、动态内存函数 三、new与delete 1.操作内置类型 2.操作自定义类型 四、operator new与operator delete 1.底层源码&#xff08;malloc/free&#xff09; 2.内置/自定义与构造和析构 3.举例 五、定位new表达式 1.举…

使用 Django 和 RabbitMQ 构建高效的消息队列系统

文章目录 RabbitMQ 简介Django 中使用 RabbitMQ总结与拓展 在现代的 Web 应用程序开发中&#xff0c;构建一个高效的消息队列系统变得越来越重要。使用消息队列可以帮助我们解耦系统中不同模块的任务&#xff0c;并提高系统的性能和可扩展性。本文将介绍如何结合 Django 和 Rab…