JUC总结2

news2024/12/23 16:46:11

synchronized锁

synchronized底层原理

当使用synchronized时,不需要自己编写代码进行上锁和上锁的操作,因为JVM帮我们把相关操作完成了。

JVM采用了monitorenter和monitorexit指令进行同步的,前者指向同步代码开始的位置,后者指向同步代码结束的位置,并通过ACC_SYNCHRONIZED标识符实现同步的,这个标识代表该方法是同步方法。monitorenter、monitorexit、ACC_SYNCHRONIZED都是基于Moniter实现的,而Moniter由ObjectMoniter实现。即synchronized的底层通过Moniter实现的,Moniter是JVM级对象,通过C++实现,线程获取锁需要对象锁关联Moniter。

ObjectMoniter包含了WaitSet、Owner、EntryList三部分组成。Owner存储获取了锁的线程,只能有一个线程获取;WaitSet用于存储处于等待状态的线程;EntryList用于存储处于阻塞状态的线程。

当代码进入synchronized时,首先根据对象锁关联的Moniter,判断Owner是否已存储了线程,若未存储,则当前线程获取锁成功,并进入到Owner中;若已存储,则进入EntryList队列等待,当Owner释放锁时,EntryList队列中的线程竞争锁的使用权(非公平的方式);当代码调用了wait()方法,则线程进入WaitSet队列中,进行等待。

synchronized可见性、有序性、可重入性实现

可见性

线程加锁前,清空工作变量中共享变量的值,需要使用共享变量时从主内存中读取共享变量的值。

线程加锁后,其他线程无法读取共享变量的值;在线程释放锁后,需要把共享变量的值刷新到主内存中。

有序性

synchronized同步的代码块,使得一次只能由一个线程执行,保证每一时刻都是单线程执行,同时as-if-serial语义的存在,单线程程序能保证最终的结果是有序的(as-if-serial语义:指令执行的顺序无论怎么重排序,执行的结果都不会被改变)。

可重入

是通过锁对象的计数器recursions记录线程获取锁的次数,当线程获取锁后,计数器加1,线程执行完后,计数器减1,直到计数器减为0。

锁升级过程

Java的对象头中,通过Mark Word结构,记录锁的状态。当后三位为001时,为无锁状态;后三位为101时为偏向锁状态;后两位为00时为轻量级锁;后两位为01时为重量级锁;后两位为11时对象标记为GC。

在无锁状态时,没有线程试图获取锁。

当第一个线程访问同步块时,且对象中处于无锁状态且偏向锁未被禁用,同步锁的对象头中存储该线程的id,并将对象头中的锁标记设置为偏向锁。

此时同一线程退出或进入这个同步块时,不需要通过CAS进行加锁或解锁。当其他线程进入这个同步块时,使用CAS操作将Mark Word中的id替换为新线程的id,若成功,则原线程不活跃,则将锁偏向至新的线程,Mark Word中的id也替换为新线程的id,锁仍为偏向锁;若失败,则原线程活跃,则撤销偏向锁,当偏向锁撤销时,遍历堆栈中所有锁记录,暂停偏向锁的线程,并检查锁对象,此时若有其他线程试图获取这个锁,则JVM撤销偏向锁,锁状态变为轻量级锁,此时偏向锁标志位设为0,锁标志位设为00。当多个线程在不同时段获取同一把锁时,JVM采用轻量级锁避免线程被阻塞和唤醒。

当一个线程试图获取轻量级锁时,JVM会在当前线程的栈帧中创建用于存储锁记录的空间,当线程发现获取的锁为轻量级锁时,会将该锁对象的Mark Word复制到存储锁记录的空间中,然后线程试图通过CAS将锁的Mark Word修改为指向锁记录的指针,若成功,则该线程获取锁成功,若失败,则说明Mark Word已被替换为其他线程的锁记录,存在竞争,此时通过自旋的方式不断尝试获取锁,当达到一定次数未成功时,锁会升级为重量级锁。

当锁被升级到重量级锁时,JVM会在操作系统层面创建一个mutex互斥锁,所有尝试获取该锁的线程都会被阻塞,直至锁被释放。

锁优化

在JDK1.6前,synchronized锁为重量级锁,在JDK1.6后,HotSpot对Java锁进行了优化,除了偏向锁、轻量级锁、自旋锁外,还有一下两种:

1、锁粗化:若JVM检测到多个连续的锁操作在一个线程中时,会将多个锁操作合并为一个更大的锁操作,可减少锁的操作次数。锁粗化主要针对循环内连续加锁和解锁的情况。

2、锁消除:Java即时编译器即(JIT)可在代码运行时对代码进行分析,若发现某些锁操作不可能被多个线程同时访问,这些锁就会被消除,减小了很多不必要的开销。

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

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

相关文章

java——网络原理初识

T04BF 👋专栏: 算法|JAVA|MySQL|C语言 🫵 小比特 大梦想 目录 1.网络通信概念初识1.1 IP地址1.2端口号1.3协议1.3.1协议分层协议分层带来的好处主要有两个方面 1.3.2 TCP/IP五层 (或四层模型)1.3.3 协议的层和层之间是怎么配合工作的 1.网络通信概念初识…

探索气象数据的多维度三维可视化:PM2.5、风速与高度分析

探索气象数据的多维度可视化:PM2.5、风速与高度分析 摘要 在现代气象学中,数据可视化是理解复杂气象模式和趋势的关键工具。本文将介绍一种先进的数据可视化技术,它能够将PM2.5浓度、风速和高度等多维度数据以直观和动态的方式展现出来。 …

国产身份域管架构图集合(信创政策AD域替换必看)

几类典型架构 双机架构 单点单机房 集群架构 多点单机房 两地三中心架构 多点多机房 多地分布式架构 多点多机房 全栈信创方案架构,欢迎探讨交流~

emp.dll文件丢失要怎么解决?荒野大镖客emp.dll修复方法分享

软件运行过程中经常遇到各种技术问题,其中之一就是动态链接库(DLL)文件丢失的现象。DLL文件是Windows操作系统中一个重要的组件,它包含运行多个应用程序所需要的代码和数据。因此,一个丢失的DLL文件,如“em…

同城活动报名系统源码活动组局找搭子小程序Java源码全开源

活动流程图 管理端设置 1.系统操作 2.活动类型 可添加线上和线下活动,线上活动,比如游戏等,需要可以进入游戏,需要签到等; 线下活动,比如线下交友等, 3.活动管理 可给用户添加活动,给活动设置报名时间,活动开始时间等; 也可查看报名列表和签到列表 4.进行中的活动 等发起…

校园导航系统C++

制作一个简单的大学城导航系统,根据用户指定的起点和终点,求出最短路径长度以及具体路径。 项目要求: 1)程序与数据相分离,地图中的所有数据都是从文件读入,而不是写在代码中 2)最短路径算法…

热敏电阻的设计

热敏电阻(NTC)的作用:抑制开机时的浪涌电流。防止开机瞬间产生的浪涌电流损坏后面的元件。 取值依据:根据对开机的脉冲电流(浪涌电流)小于多少A? 由,这个U是指最大输入电压,I为要求的浪涌电流。 NTC是负温度系数的热…

设计模式23——状态模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用,主要是下面的UML图可以起到大作用,在你学习过一遍以后可能会遗忘,忘记了不要紧,只要看一眼UML图就能想起来了。同时也请大家多多指教。 状态模式(State&am…

打造高效上传体验:基于Kotlin的Android快速上传框架

1. 引言 在Android开发中,文件上传操作常常面临各种挑战,为此我开源了一个高效、易用的快速上传框架,助力开发者轻松实现文件上传功能。 GitHub项目地址: 点我 2. 框架特点概述 纯Kotlin编写:简洁、现代的编程语言。MVVM架构&a…

动态分配函数参数用二级指针的作用

文章目录 前言一、案例 前言 在一些情况下,我们需要在函数内部动态地分配内存来存储结构体,并且需要在函数外部访问该结构体。在这种情况下,可以使用二级指针作为函数参数来实现动态内存分配,并且在函数外部使用指针访问结构体。…

py黑帽子学习笔记_web攻击

python网络库 py2的urllib2 py3好像把urllib2继承到了标准库urllib,直接用urllib就行,urllib2在urllib里都有对应的接口 py3的urllib get请求 post请求,和get不同的是,先把post请求数据和请求封装到request对象,再…

数字化转型对企业来说意味着什么?

数字化转型是当今社会不可避免的趋势,它的发展其实是多方面因素影响导致的。首先,随着科技的迅速发展,人们对于信息获取和处理的需求越来越强烈,这促使了各行各业都要朝着数字化方向发展。其次,全球化的潮流让企业需要…

制作U启动装win10系统

一、背景 在我们日常上班过程中经常会遇到以下问题: 1、c盘快满了 2、新电脑用着好卡 3、买新电脑不会装系统 二、实现方式 通常我们遇到这种情况 都会选择去电脑专卖店找专人装系统 但是这样又需要花费自己的money,这样显得自己不够专业像个菜鸟&#…

【成品设计】基于STM32单片机的语音远程运算器

《基于STM32单片机的语音远程运算器》 输入端 所需器件: STM32最小系统板。语音识别模块:用于检测语音命令。蓝牙模块:作为主机用于与输出端蓝牙模块进行连接,发送数据。蜂鸣器红色LED:用于语音命令检测错误提示。 …

记录一次云服务器无法连接的排查过程

运行环境:阿里云服务器 故障外显原因:登录失败,操作系统禁用了密码登录方式 控制台监控数据显示云盘读写BPS拉满了 因为之前问过线上售后,让安装了atop监控,,所以先打开atop日志: atop -r /var/log/atop…

揭秘数字货币:比特币背后的技术逻辑

随着科技的飞速发展,数字货币作为一种新兴的经济形态,已经逐渐走入我们的视野。其中,比特币无疑是这一领域的佼佼者。那么,比特币背后的技术逻辑究竟是什么呢?本文将为您揭开这一神秘面纱。 一、区块链技术:比特币的基石 比特币的核心技术就是区块链(Blockchain)。区块…

[Algorithm][动态规划][子序列问题][最长递增子序列][摆动序列]详细讲解

目录 0.子序列 vs 子数组1.最长递增子序列1.题目链接2.算法原理详解3.代码实现 2.摆动序列1.题目链接2.题目链接3.代码实现 0.子序列 vs 子数组 子序列: 相对顺序是跟源字符串/数组是一致的但是元素和元素之间,在源字符串/数组中可以是不连续的一般时间…

前端开发:$nextTick()的使用及原理

目录 前言 $nextTick()的概念 $nextTick()的用法和原理 1、$nextTick()用法 2、$nextTick()原理 $nextTick()的具体使用示例 拓展:面试中考察$nextTick()的底层原理 最后 前言 在前端开发中,涉及到JS原生的使用原理是非常重要的知识点&#xff0…

Spring Boot详解:深入了解与实践

文章目录 1. Spring Boot简介1.1 什么是Spring Boot?1.2 Spring Boot的历史背景1.3 Spring Boot的核心特点 2. Spring Boot的核心概念2.1 自动配置2.1.1 自动配置原理2.1.2 自定义配置 2.2 Spring Boot Starter2.3 Spring Boot CLI 3. Spring Boot的主要功能模块3.1…

Microsoft Dynamics 365 Business Central 讲解VAT RATE CHANGE TOOL(增值税税率更改工具)

学习目标: 如果使用VAT RATE CHANGE TOOL(增值税税率更改工具) 过程演示: 1.创建新的VAT产品过账组 2.创建新的总账科目以过账采购、销售和逆向征收增值税。 3.给新的VAT产品过账设置过账设置 4.创建一个新的一般产品过账组 5…