企业网站空间域名/广告代理商
文章目录
- 前言
- 对象结构
- Monitor 对象
- Synchronized特征
- 原子性
- 可见性
- 有序性
- 可重入锁
- 锁升级的过程
前言
源码级别剖析Synchronized
对象结构
Synchronized是Java中的隐式锁,它的获取锁和释放锁都是隐式的,完全交由JVM帮助我们操作,在了解Synchronized关键字之前,首先要学习的知识点就是Java的对象结构,因为Synchronized锁就是存放在Java对象中的,Java对象结构如下图所示:
可以清晰的看到Java对象由三部分组成,分别是对象头、实例数据、填充数据,我们的锁就存放在对象头中,接下来我们将对对象结构做一个简单的解析:
- mark-down:对象标记字段占8个字节,用于存储有关锁的标记位等信息,从图中可以看出有哈希值、轻量级锁的标记位、偏向锁标记位等。
- Klass Pointer:Class对象的类型指针,它就是指向当前对象属于哪个Class类的指针,jdk1.8默认开启压缩指针后占用4个字节,关闭压缩指针后占用8个字节。
- 对象实际数据:这部分内容包括对象的所有成员变量,大小由各个成员变量决定,比如byte占用1个字节、int占用4个字节等。
- 对其填充:这部分内容仅仅只是做到空间补全,就是一个占位符的作用,因为HotSpot虚拟机的内存管理系统要求对象的起始地址必须是8字节的整数倍,因此如果出现对象实例没有对齐的话,就需要通过对其填充来补充。
在mark-down锁类型标记中,可以看到总共有五种类型,分别是无锁、偏向锁、轻量级锁、重量级锁、GC标记,所以如果只是使用2比特标记是无法完全被表示出来的,所以引入了一位偏向锁标记,也就是说001为无锁、101为偏向锁。
Monitor 对象
上面介绍了对象结构,可以看到在Mark-down中会存储不同的锁信息,当锁的状态为重量级锁(10)时,Mark-down中会存放一个指向Monitor对象的指针,这个Monitor对象也称为监视器锁。
synchronized的运行机制,就是JVM检测到共享对象存在不同的竞争情况的时候,会自动切换到适合的锁实现,这种切换就是锁的升级、降级。(很多地方都说锁只能升级,不能降级,其实这种说法是错误的,在《Java并发编程的艺术》书中说到,对于偏向锁来说,它可以进行降级到无锁状态,也叫做偏向锁的撤销)。
那么现在就存在着三种不同的Monitor实现,分别是偏向锁、轻量级锁和重量级锁。如果一个Monitor被一个线程持有的时候,就说明这个线程拿到了锁。
Java中的Monitor是基于C++的ObjectMonitor实现的,它的主要成员包括:
- _owner:指向持有ObjectMonitor对象的线程
- _WaitSet:存放处于wait状态的线程队列,即调用wait()方法的线程
- _EntryList:存放处于等待锁Block状态的线程队列
- _count:约为_WaitSet+_EntryList的节点数之和
- _cxq:多个线程争抢锁,会先存入这个单向链表
- _recursions:记录重入次数
- _object:存储的Monitor对象
获取Monitor对象的线程进入_owner区的时候,_count+1,如果线程调用了wait()方法,那么会释放Monitor对象(释放锁),_owner恢复为空同时_count-1。此时该线程进入_WaitSet队列中,等待被唤醒。
从上述的描述可以看出,synchronized关键字获取锁的关键在于每个对象的对象头中,这也就能解释了为什么synchronized()括号里存放任何对象都能获得锁的特征。
Synchronized特征
原子性
原子性,就是说一个操作要么完成,要么不完成,不存在完成一半的情况,也就是说这个操作是不可中断的。
synchronized可以保证同一时间内只有一个线程拿到锁,进入到代码块去执行代码,这样说如果不能理解,那么就想象下面的一个场景,有一个厕所只有一个坑位,并且厕所还上锁了,就是为了防止多人一起上厕所的不文明现象,每个人上厕所都必须要去厕所管理员处缴费,缴费后才能拿到锁再去上厕所,上完厕所再把要是还给厕所管理员,synchronized就是厕所管理员,保证一次只能有一个人拿到锁,并且每个人用完厕所之后都必须要归还钥匙。
接下来看到下面一个同步加方法:
public static void add() {synchronized (Demo.class) {counter++;}
}
将其进行反编译后查看代码:
javap -v -p Demo
public static void add();descriptor: ()Vflags: ACC_PUBLIC, ACC_STATIC , ACC_SYNCHRONIZEDCode:stack=2, locals=2, args_size=00: ldc #12 // class2: dup3: astore_04: monitorenter5: getstatic #10 // Field counter:I8: iconst_19: iadd10: putstatic #10 // Field counter:I13: aload_014: monitorexit15: goto 2318: astore_119: aload_020: monitorexit21: aload_122: athrow23: returnException table:
可以看到有两个指令明显和monitor有关:
monitorenter:在判断拥有同步标识 ACC_SYNCHRONIZED 抢先进入此方法的线程会优先拥有 Monitor 的 owner ,此时计数器 +1
monitorexit:当执行完退出后,计数器 -1,归 0 后被其他进入的线程获得
可见性
可见性指的是当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他的线程能够立马感知,能看到修改后的值。
而Synchronized拥有可见性,因为它加锁和释放锁都有如下语义:
- 线程加锁前,必须清空工作内存中共享变量的值,从而从主内存中读取最新的共享变量的值。
- 线程释放锁时,必须把共享变量的值刷新到主内存中。
- synchronized的可见性依赖于操作系统内核互斥锁实现,相当于JVM中的lock,unlock,退出代码块时需要刷新共享变量到主内存中,这一点和volatile关键字不一样,volatile关键字的可见性是依赖于内存屏障(也叫内存栅栏)来实现的。
有序性
as-if-serial,就是保证不管编译器和处理器为了性能优化怎样进行指令重排序,都需要保证单线程下的运行结果的正确性。也就是常说的:如果在本线程内观察,所有的操作都是有序的,如果在一个线程观察另一个线程,所有的操作都是无序的。
注意,这里的有序性和volatile是不一样的,它并不是volatile的防止指令重排序。
可重入锁
可重入锁的概念很简单,就是一个线程可以多次获取自己持有的对象锁,这种锁就是可重入锁,同样的释放锁也就需要释放相同数量的锁。synchronized锁对象中就有一个计数器,用于存放获取锁的次数,也就是重入次数。
锁升级的过程
synchronized 锁有四种交替升级的状态:无锁、偏向锁、轻量级锁和重量级,这几个状态随着竞争情况逐渐升级。
相关文章:

【java】彻底剖析 Synchronized
文章目录 前言对象结构Monitor 对象Synchronized特征原子性可见性有序性可重入锁 锁升级的过程 前言 源码级别剖析Synchronized 对象结构 Synchronized是Java中的隐式锁,它的获取锁和释放锁都是隐式的,完全交由JVM帮助我们操作,在了解Sync…...

有反爬机制就爬不了吗?那是你还不知道反反爬,道高一尺魔高一丈啊
文章目录 一、从用户请求的Headers反爬虫二、基于用户行为反爬虫(1)方法1(2)方法2 三、动态页面的反爬虫四.总结 不知道你们在用爬虫爬数据的时候是否有发现,越来越多的网站都有自己的反爬机制,抓取数据已经…...

手把手教你本地CPU环境部署清华大模型ChatGLM-6B,利用量化模型,本地即可开始智能聊天,达到ChatGPT的80%
大家好,我是微学AI,今天教你们本地CPU环境部署清华大ChatGLM-6B模型,利用量化模型,每个人都能跑动大模型。ChatGLM-6B是一款出色的中英双语对话模型,拥有超过62亿个参数,可高效地处理日常对话场景。与GLM-1…...

FFmpeg 自定义IO CONTEXT实现音频解码,以及seek函数
对于从音频流buffer中解码的场景中,我们需要实现自己的io context 去从buffer中解码,参考ffmepg官方实例:doc/examples/avio_reading.c 关于是否要实现avio context中的seek函数,需要看需要解码什么格式,大部分格式不…...

技能升级(2023寒假每日一题 13)
小蓝最近正在玩一款 RPG 游戏。 他的角色一共有 N N N 个可以加攻击力的技能。 其中第 i i i 个技能首次升级可以提升 A i A_i Ai 点攻击力,以后每次升级增加的点数都会减少 B i B_i Bi。 ⌈ A i / B i ⌉ ⌈A_i/B_i⌉ ⌈Ai/Bi⌉(上取整&a…...

低频量化之 可转债 配债数据及策略 - 全网独家
目录 历史文章可转债配债数据 待发转债(进展统计)待发转债(行业统计)待发转债(5证监会通过,PE排序)待发转债(5证监会通过,安全垫排序)待发转债(5证…...

Code area 和Data area的区别
Code Area FLASH :程序在这个flash运行时,几乎没有延时, 运行速度以时钟设置为准。 Data Area FLASH: 程序在这段flash运行时,每条语句都有延时, 最后的速度可能是以10M为时钟(举例)…...

Oracle LiveLabs DB Security (数据库安全)实验汇总
在Oracle LiveLabs中,和数据库安全相关的实验分为2个系列,共12个实验。 Oracle数据库安全架构如下图: 这些实验涉及了Oracle安全相关的特性,企业版选件,独立产品和服务。 关于Oracle安全产品的中文主页可见&#…...

PAT A1012 The Best Rank
1012 The Best Rank 分数 25 作者 CHEN, Yue 单位 浙江大学 To evaluate the performance of our first year CS majored students, we consider their grades of three courses only: C - C Programming Language, M - Mathematics (Calculus or Linear Algrbra), and E -…...

“我和AI抠图网站的秘密情缘“
在浏览器里面意外发现了一个AI抠图工,了解了一下,AI抠图基于深度学习框架,结合智能检测识别技术,目前已能够实现高精视,秒级全自动主体、场景像素级识别等的分割能力。 一款好的抠图工具,可以把照片变得更加…...

最多能打多少场比赛呢
凌乱的yyy / 线段覆盖 题目背景 快 noip 了,yyy 很紧张! 题目描述 现在各大 oj 上有 n n n 个比赛,每个比赛的开始、结束的时间点是知道的。 yyy 认为,参加越多的比赛,noip 就能考的越好(假的&#x…...

鸿蒙Hi3861学习二-程序烧录与日志输出
一、准备事项 开发板:BearPi-Hm Nano windows工具:HiBurn.exe https://pan.baidu.com/s/18OQD1_BvjNKD_J2e2iX3qg?pwdadrs 提取码:adrs windows工具:MobaXterm和RaiDrive 把ubuntu文件夹映射到windows本地。可以参考如下链接&am…...

typescript Awaited<Type>教程用法
typescript Awaited教程用法 文章目录 typescript Awaited<Type>教程用法 ts4.5发布了Awaited,但是很多人不明白Awaited的用法。 首先看一下官方的说明:这种类型旨在模拟函数await中的操作async,或 s.then()上的方法——特别是它们递归…...

AES硬件运算单元
功能描述 AES单元主要功能如下: 支持解密密钥扩展 支持128bit/192bit/256bit的密钥长度支持ECBCBCCTRM支持DMA进行自动数据传输 支持GF(2^128)域下的乘法,支持GMAC 工作模式 AES有4种工作模式,通过配置MODE1:0]寄存器设置。 模式1:用存储在AES KEYRx寄存…...

mulesoft MCIA 破釜沉舟备考 2023.04.28.26 (易错题)
mulesoft MCIA 破釜沉舟备考 2023.04.28.26 (易错题) 1. According to MuleSoft, what is a major distinguishing characteristic of an application network in relation to the integration of systems, data, and devices?2. An integration team follows MuleSoft’s r…...

k210单片机定时器的应用
定时器应该是一个单片机的标准配置,所以k210也是有的,拥有3个定时器,具体的使用方法我们往下看: 分步介绍: 首先是相关模块的使用 构造函数: machine.Timer(id,channel,modeTimer.MODE_ONE_SHOT,period100…...

linux0.12-7-1
[272页] 第7章 初始化程序 1、main.c主要内核初始化工作。 2、如果能完全理解这里调用的所有程序,那么看完这张内容后应该对Linux内核有了大致的了解。 3、 有一定的C语言知识 4、 需要GNU gcc手册在身边作为参考,因为在内核代码很多地方使用gcc的扩展…...

设置 文本框 自动填充背景颜色 为白色
关于autofill伪类的 兼容性: 在现代浏览器中,包括Chrome、Safari、Firefox等,都支持:autofill伪类,但在使用时必须加上浏览器前缀-webkit-,即:-webkit-autofill。 在旧版的浏览器中,可能不支持:autofill伪…...

Bitmap引起的OOM问题
作者:向阳逐梦 1.什么是OOM?为什么会引起OOM? 答:Out Of Memory(内存溢出),我们都知道Android系统会为每个APP分配一个独立的工作空间,或者说分配一个单独的Dalvik虚拟机,这样每个APP都可以独立…...

【JavaEE初阶】认识线程(Thread)
目录 🌾 前言 🌾 了解线程 🌈1.1 线程是什么? 🌈1.2 一些基本问题 🌾2、创建线程的方式 🌈 2.1 继承Thread类 🌈 2.2 实现Runnable接口并重写run()方法 🌈 注意…...

自动化运维工具一Ansible Roles实战
目录 一、Ansible Roles概述 1.1.roles官方的目录结构 1.2.Ansible Roles依赖关系 二、Ansible Roles案例实战 2.1.Ansible Roles NFS服务 2.2 Roles Memcached 2.3 Roles-rsync服务 一、Ansible Roles概述 之前介绍了 Playbook 的使用方法,对于批量任务的部…...

json 中有递归parentId节点转 c#实体类时如何处理
如果您有一个具有递归parentId节点的JSON数据,并且您需要将其转换为C#实体类,则可以使用以下方法: 创建一个类来表示JSON对象的节点,包括它的属性和子节点。 public class Node {public int Id { get; set; }public string Name …...

给大家介绍几个手机冷门但好用的小技巧
技巧一:拍照识别植物 手机的拍照识别植物功能是指在使用手机相机时,可以通过对植物进行拍照,并通过植物识别技术,获取植物的相关信息和资料。其主要优点如下: 方便实用:使用拍照识别植物功能,…...

2.3 定点乘法运算
学习目标: 如果我要学习定点乘法运算,我会按照以下步骤进行学习: 确定学习目标:明确学习定点乘法运算的目的和重点,以便有针对性地进行学习。 掌握基础知识:首先需要了解定点数和定点乘法的基础知识&…...

C++每日一练:打家劫室(详解动态规划法)
文章目录 前言一、题目二、分析三、代码总结 前言 这题目出得很有意思哈,打劫也是很有技术含量滴!不会点算法打劫这么粗暴的工作都干不好。 提示:以下是本篇文章正文内容,下面案例可供参考 一、题目 题目名称: 打家…...

Wireshark使用
Capture Filters 语法 <Protocol name><Direction><Hosts><Value><Logical operations><Expressions> e.g 1.tcp src port 443 只抓取来源端口是443的tcp数据 2.not arp 不获取arp数据 3.port 80 获取端口是80的数据,不指…...

这才是 SpringBoot 统一登录鉴权、异常处理、数据格式 的正确姿势
本篇将要学习 Spring Boot 统一功能处理模块,这也是 AOP 的实战环节 用户登录权限的校验实现接口 HandlerInterceptor WebMvcConfigurer 异常处理使用注解 RestControllerAdvice ExceptionHandler 数据格式返回使用注解 ControllerAdvice 并且实现接口 Response…...

Java面试题总结 | Java面试题总结6-MYSQL模块(持续更新)
Mysql 文章目录 Mysql关系型数据库和非关系型数据库的区别什么是ORM?-**mybatis**如何评估一个索引创建的是否合理?Count函数执行效果上:执行效率上:count(主键)和count(列名) 数据库的三大范式Mysql中char和varchar的区别数据库设计或者功能…...

Linux命令集(Linux文件管理命令--mv指令篇)
Linux命令集(Linux文件管理命令--mv指令篇) Linux文件管理命令集(mv指令篇)2. mv(move)1. 文件移动2. 递归移动目录3. 文件目录重命名4. 强制移动5. 备份覆盖的目标文件6. 试探性移动7. 显示移动进度8. 补集操作9. 修改文件的权限…...

不一样的 Git 之间 | GitLab vs GitHub vs Gitee vs GitCode
Git仓库对比:GitLab vs GitHub vs Gitee vs GitCode 在软件开发中,版本控制是必不可少的工具之一。Git作为目前最为流行的版本控制系统,也逐渐成为了开发者们的标配。但是,如何选择一个合适的Git仓库来存储您的代码呢?…...