多线程教程(七)monitor概念、synchronized原理浅析

服务器卡死排查实战:从现象分类到根因定位的完整手册 服务器卡死是运维中最令人头疼的故障之一,从游戏圈吐槽的“土豆服务器”到生产环境中的Linux系统无响应、rsync复制挂起,本质都是系统或进程失去正常响应能力。其原理通常涉及CPU、内存、磁盘IO或网络资源耗尽,以及内核和驱动异常。掌握系统化的排查方法,能够帮助工程师快速定位根因、缩短故障时间,避免盲目重启。本文从资源、层级、场景等多维度分类,结合top、dmesg、strace等工具,梳理一套从现象确认、指标收集、日志分析到进程定位的实战排查流程,并覆盖常见高频场景与预防治理建议。无论你是运维新手还是老手 阅读详情

多线程教程(七)monitor概念

一、Java 对象头

java对象通常在内存中主要由两部分组成,一是对象头,另一部分是对象中的成员变量。

以 32 位虚拟机为例,对象头如下所示:

(1)普通对象

|--------------------------------------------------------------| 
|						 Object Header (64 bits) 			   |
|------------------------------------|-------------------------|
| 	Mark Word (32 bits) 			 |	 Klass Word (32 bits)  |
|------------------------------------|-------------------------|

klass word 部分表示类的类型,它是个指针,指向对象对应的class

(2)数组对象

|-------------------------------------------------------------------------|
|					    Object Header (96 bits) 						  |
|-----------------------|------------------------|------------------------|
|   Mark Word(32bits) 	|	 Klass Word(32bits)  | 	array length(32bits)  |
|-----------------------|------------------------|------------------------|

(3)其中 Mark Word 结构为

|----------------------------------------------------|--------------------|
| 			Mark Word (32 bits)						 | 		State 		  |
|----------------------------------------------------|--------------------|
| hashcode:25 	| age:4 	| biased_lock:0 	| 01 | 		Normal		  |
|----------------------------------------------------|--------------------|
| thread:23   | epoch:2 | age:4 | biased_lock:1 | 01 |	    Biased 		  |
|----------------------------------------------------|--------------------|
| 		ptr_to_lock_record:30 					| 00 | Lightweight Locked |
|----------------------------------------------------|--------------------|
|		 ptr_to_heavyweight_monitor:30 			| 10 | Heavyweight Locked |
|----------------------------------------------------|--------------------|
| 												| 11 | 	 Marked for GC 	  |
|----------------------------------------------------|--------------------|

64 位虚拟机 Mark Word

|-------------------------------------------------------|-----------------|
| 					Mark Word (64 bits)				 	| 		State 	  |
|-------------------------------------------------------|-----------------|
|unused:25|hashcode:31|unused:1|age:4|biased_lock:0| 01 | 		Normal    |
|-------------------------------------------------------|-----------------|
| thread:54 | epoch:2 |unused:1|age:4|biased_lock:1| 01 | 		Biased    |
|-------------------------------------------------------|-----------------|
| 			ptr_to_lock_record:62 			       | 00 |LightweightLocked|
|-------------------------------------------------------|-----------------|
| 		ptr_to_heavyweight_monitor:62			   | 10 |HeavyweightLocked|
|-------------------------------------------------------|-----------------|
| 												   | 11 |  Marked for GC  |
|-------------------------------------------------------|-----------------|
二、monitor原理

Monitor 被翻译为监视器或管程

每个 Java 对象都可以关联一个 Monitor 对象,如果使用 synchronized 给对象上锁(重量级)之后,该对象头的Mark Word 中就被设置指向 Monitor 对象的指针

偏向锁和轻量级锁是不会关联Monitor的,具体原理后续章节(可能放在锁升级章节)会进行介绍

Monitor 结构如下

在这里插入图片描述

刚开始 Monitor 中 Owner 为 null

  1. 当 Thread-2 执行 synchronized(obj) 就会将 Monitor 的所有者 Owner 置为 Thread-2,Monitor中只能有一个 Owner

  2. 在 Thread-2 上锁的过程中,如果 Thread-3,Thread-4,Thread-5 也来执行 synchronized(obj),就会进入EntryList,状态变为 BLOCKED

  3. Thread-2 执行完同步代码块的内容,然后唤醒 EntryList 中等待的线程来竞争锁,竞争的时是非公平的

  4. 图中 WaitSet 中的 Thread-0,Thread-1 是之前获得过锁,但条件不满足进入 WAITING 状态的线程,后面讲wait-notify 时会分析

简单点说waitSet里面就是拿到过这个锁的线程执行wait后会释放锁,进入waitset,等待后续拿到这个锁的线程执行notify或notifyall来激活在waitSet里的线程。

该方法常用来等待指定线程产生结果后继续执行。

注意:

synchronized 必须是进入同一个对象的 monitor 才有上述的效果

不加 synchronized 的对象不会关联监视器,不遵从以上规则

三、synchronized 原理

执行下属代码

static final Object lock = new Object();
static int counter = 0;
public static void main(String[] args) {
     synchronized (lock) {
     	counter++;
     }
}

对应的字节码:

public static void main(java.lang.String[]);
 descriptor: ([Ljava/lang/String;)V
 flags: ACC_PUBLIC, ACC_STATIC
 Code:
     stack=2, locals=3, args_size=1
         0: getstatic #2 // <- lock引用 (synchronized开始)
         3: dup
         4: astore_1 // lock引用 -> slot 1
         5: monitorenter // 将 lock对象 MarkWord 置为 Monitor 指针
         6: getstatic #3 // <- i
         9: iconst_1 // 准备常数 1
         10: iadd // +1
         11: putstatic #3 // -> i
         14: aload_1 // <- lock引用
         15: monitorexit // 将 lock对象 MarkWord 重置, 唤醒 EntryList
         16: goto 24
         19: astore_2 // e -> slot 2 
         20: aload_1 // <- lock引用
         21: monitorexit // 将 lock对象 MarkWord 重置, 唤醒 EntryList
         22: aload_2 // <- slot 2 (e)
         23: athrow // throw e
         24: return
     Exception table:
     	from to target type
     		6 16 19 any
     		19 22 19 any
     LineNumberTable:
         line 8: 0
         line 9: 6
         line 10: 14
         line 11: 24
     LocalVariableTable:
     	Start Length Slot Name Signature
     		0 25 0 args [Ljava/lang/String;
     StackMapTable: number_of_entries = 2
     	frame_type = 255 /* full_frame */
         offset_delta = 19
         locals = [ class "[Ljava/lang/String;", class java/lang/Object ]
         stack = [ class java/lang/Throwable ]
     	frame_type = 250 /* chop */
     		offset_delta = 4

注意

方法级别的 synchronized 不会在字节码指令中有所体现

16、保障Azure应用安全:密钥管理与身份认证 本文深入探讨了保障Azure应用安全的关键措施,包括使用网络安全工具(如Application Gateway和Azure Front Door)防范攻击,解决传统密钥和机密存储方式的安全隐患,以及通过Azure Key Vault实现敏感信息的安全管理。同时,介绍了使用托管标识实现Azure资源间安全访问的方法,并结合实际操作步骤展示了如何配置Key Vault、设置访问策略、存储机密以及授予Web应用对SQL Server的访问权限。最后,对不同安全措施进行了比较,并提出了在开发、测试及生产环境中的综合 阅读详情

相关推荐

沈阳计算机研究所复试,沈阳计算所复试试题附答案.doc

沈阳计算所复试试题附答案目录数据结构1200612007220085200914操作系统16200616200718200818200919组成原理20200620200720200821200921经典算法22数据结构2006数据结构部分(共25分,第1题10分,第2题15分)在(下图)所示的有向图中:v1 v2v4 ...

weixin_42511053的博客 861

Synchronized原理

Monitor 原理 Synchronized原理 static final Object lock = new Object(); static int counter = 0; public static void main(String[] args) { synchronized (lock) { counter++; } } 对应的字节码为: public static void main(java.lang.String[]); descriptor: ([Ljava/

TigRer的博客 377

Vivado 2021.1 实战:手把手教你用IEEE1735 V2加密你的Verilog源码(附完整TCL命令)

本文详细介绍了在Vivado 2021.1中使用IEEE1735 V2标准加密Verilog源码的全流程,包括许可证申请、密钥文件配置、TCL命令执行及加密后验证。通过实战步骤和完整TCL命令,帮助开发者有效保护FPGA设计知识产权,确保核心算法安全。

weixin_42706667的博客 191

synchronized底层monitor原理

synchronized底层使用monitor来控制锁的活动。了解monitor中的各个属性值的含义,锁的竞争流程。

qq_63815371的博客 1168

Cursor 团队代码规范与开发规则

本文提出了一套 Cursor 项目开发规范,涵盖代码结构、命名、日志、测试等关键环节,旨在提升代码质量和团队协作效率。核心规则包括:文件不超过2000行、函数不超过80行;变量命名禁用无意义单词;日志只记录关键信息;配置项禁止硬编码;依赖和敏感信息统一管理;核心逻辑测试覆盖率≥80%;Git提交遵循Conventional Commits规范。通过一个车辆数据处理函数的改造案例,展示了从"不规范"到"规范"的代码优化过程,体现了拆分函数、常量管理、错误处理等规范的实际

1255

Rocky Linux 9.2:利用LVM动态调整/home与/根分区空间分配

本文详细介绍了在Rocky Linux 9.2系统中,如何利用LVM(逻辑卷管理器)动态调整/home与根分区(/)的空间分配。针对根分区空间不足而/home分区闲置的常见问题,文章提供了从检查磁盘布局、备份数据、卸载分区、调整逻辑卷大小到重建文件系统的完整操作步骤,并重点说明了XFS与EXT4文件系统在缩容时的不同处理方法,帮助系统管理员安全、在线地实现存储空间的灵活调配。

weixin_29271263的博客 177

synchronized 的 monitor 机制

monitor 是 synchronized 中用以实现线程之间的互斥与协作的主要手段。每个 monitor 在每个时刻,只能被一个线程持有,该线程就是 activeThread,其它线程都是 waitingThread,分别在两个队列 entrySet 和 waitSet 里等候。在 entrySet 中等待的线程状态是 waiting for monitor entry,而在 wait set 中等待的线程状态是 in Object.wait()。

JellyfishMIX 的博客 1427

STM32F407-OV7670(无FIFO)-ONENET-实现摄像头画面上传到onenet(EDP协议)

EDP协议 EDP协议文档说明:https://leoeinstein.lanzous.com/ifX1Ckfkaaf 服务器登录 登录流程: (1)客户端发送连接请求(CONN_REQ) (2)服务器验证请求的合法性 (3)服务器发送一个回执(CONN_RESP)给客户端 其中请求包含三部分:消息头、选项和消息体。 1、消息头 包括消息的类型和剩余消息长度。 2、选项 包括协议名称、协议版本、连接标志、保持连接时间。 3、消息体 可能包含设备ID、用户ID(可选)、鉴权信息(看采取什么方式登录)。 设备

LiangWF22的博客 1万+

java基础Synchronized底层monitor

synchronized底层使用monitor来控制锁的活动。了解monitor中的各个属性值的含义,锁的竞争流程。ObjectMonitor主要数据结构如下:

练习时长1个月 2522

SolidWorks速成教程P4-4【装配体 | 第四节】——装配体内修改模型&编辑配合方法&配合报错的解决方法

截止目前已介绍完 SolidWorks装配体的常用功能,但基础薄弱的小伙伴或许对装配体的各类功能还不够熟悉。所以这节将进一步加强装配体的学习,同时介绍新手容易犯的错误。总结出三点,一是装配体内修改模型,二是编辑配合,三是配合报错的解决方法。

嵌入式阿齐Archie 5552

从 SM30 到 Fiori:在 SAP BTP ABAP Environment 里创建 Business Configuration 配置维护对象的完整路径

摘要 在SAP BTP的ABAP环境中,传统SAP GUI和SM30配置方式被Business Configuration (BC)替代。BC通过Fiori应用维护配置,支持传输和权限控制。配置表需满足可维护性条件,如允许数据维护、包含技术字段等。通过ADT生成Maintenance Object和Transport Object,实现配置发布与治理。权限管理需创建IAM App和Business Catalog,确保配置可维护。BC在云端延续了可控、可追溯、可发布的治理原则。 (字数:150)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 242

【Java并发知识总结 | 第五篇】深入理解Synchronized底层原理(Monitor对象、Synchronized锁优化)

深入理解Synchronized底层原理(Monitor对象、Synchronized锁优化)

踢桃的成长之路 3057

基于STM32、HAL库的WF162A 11BA T&R气压传感器 驱动程序设计

/ 转换为7位地址。* @param temperature: 存储读取到的温度值(°C)* @param temperature: 存储读取到的温度值(°C)* @param pressure: 存储读取到的压力值(bar)* @param pressure: 存储读取到的压力值(bar)* @param range: 压力范围(bar)

corlin6688的博客 361

synchronized底层原理—Monitor监视器

深入了解sychronized 文章目录深入了解sychronized1. 作用2. 底层实现原理1. Monitor类2. 管程3. ObjectMonitor4. _WaitSet5. _EntryList6. ObjectWaiter3. 对象头1. 轻量级锁2. 重量级锁4. 总结参考 sychronized——java多线程锁的关键字 1. 作用 多线程情况下,同步代码的互斥访问 有效的解决了共享变量的可见性问题 解决了指令重排序的问题 2. 底层实现原理 小插曲:用idea插件jclassl

qq_40788718的博客 3717

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Synchronized底层核心原理

本篇文章是关于并发编程中Synchronized锁的底层核心原理知识记录,由于篇幅原因,下篇文章将介绍各种锁的优化原理。

小威的博客 8694

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Synchronized实现原理

查看带有Synchronized语句块的class文件可以看到在同步代码块的起始位置插入了moniterenter指令,在同步代码块结束的位置插入了monitorexit指令。(JVM需要保证每一个monitorenter都有一个monitorexit与之相对应,但每个monitorexit不一定都有一个monitorenter)但是查看同步方法的class文件时,同步方法并没有通过指令moni...

Lzc的博客 1万+

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Monitor 原理和 Synchronized 原理

Monitor 原理和 Synchronized 原理 Monitor 原理 Monitor 被翻译为监视器或管程。 每个 Java 对象都可以关联一个 Monitor 对象,如果使用 synchronized 给对象上锁(重量级)之后,该对象头的 Mark Word 中就被设置指向 Monitor 对象的指针。(如果关于对象头不清晰的可以看看我上一篇关于对象头的博客)。Java 使用对象锁 ( 使用 synchronized 获得对象锁 ) 保证工作在共享的数据集上的线程互斥执行。 Monitor 结构如

weixin_43896929的博客 1124

Monitor与Synchronized原理详解

Monitor与Synchronized原理详解Monitor概念Monitor原理Synchronized原理Synchronized原理进阶轻量级锁锁膨胀自旋优化偏向锁偏向状态 Monitor概念 Java对象头: 以32位虚拟机为例: 普通对象: 数组对象: 其中 Mark Word 结构为: 64 位虚拟机 Mark Word: Monitor原理 (1) Monitor 被翻译为监视器或管程 (2) 每个 Java 对象都可以关联一个 Monitor 对象,如果使用 synchronize

DJL新时代农民工DJL 1303

Monitor、synchronized原理

1、Monitor概念 java对象头 以32位虚拟机为例 Integer 8(头)+4(value) int 4 Monitor(锁) Monitor被翻译为监视器或管程 每个Java对象都可以关联一个Monitor对象,如果使用synchronized 给对象上锁(重量级)之后,该对象头的Mark Word中就被设置指向Monitor对象的指针 EntryList等待队列 分析: 刚开始Monitor中Owner为null 当Thread-2执行synchronized(obj)就会将Moni

qq_43430343的博客 452

浅析synchronized锁升级的原理与实现 1

浅析synchronized锁升级的原理与实现

水w的博客 1664

java什么是monitor和Monitor监视器锁、对象布局

文章目录Monitor监视器锁什么是moniter对象布局 Monitor监视器锁 每个同步对象都有一个自己的Monitor(监视器锁),加锁过程如下图所示: 任何一个对象都有一个Monitor与之关联,当且一个Monitor被持有后,它将处于锁定状态。Synchronized在JVM里的实现都是 基于进入和退出Monitor对象来实现方法同步和代码块同步,虽然具体实现细节不一样,但是都可以通过成对的MonitorEnter和 MonitorExit指令来实现。 monitorenter:每个对象都是一个监

qq_41358574的博客 8646

理解Monitor监视器锁原理

理解Monitor监视器锁原理 任何一个对象都有一个Monitor与之关联,当且一个Monitor被持有后,它将处于锁定状态。Synchronized在JVM里的实现都是 基于进入和退出Monitor对象来实现方法同步和代码块同步,虽然具体实现细节不一样,但是都可以通过成对的MonitorEnter和MonitorExit指令来实现。 • monitorenter:每个对象都是一个监视器锁(monitor)。当monitor被占用时就会处于锁定状态,线程执行monitorenter指令时尝试获取monito

qq_43783527的博客 7362

多线程Monitor工作原理

我们都知道synchronized的作用是用来保证修饰的代码或者方法执行有且只有一个线程执行,也就是锁。那么在执行被锁住的方式时,synchronized就需要通过monitor来记录和保证锁的状态。所以monitor这里的作用其实就是起到了控制synchronized什么时候获取锁,什么时候释放锁,以及记录了锁被重用的次数。🍎。

私欲日生,如地上尘,一日不扫,便又有一层。着实用功,便见道无终穷,愈探愈深,必使精白无一毫不彻方可。 1658

synchronized()_synchronized底层原理—Monitor监视器

文章目录深入了解synchronized1. 轻量级锁2. 重量级锁1. Monitor类2. 管程3. ObjectMonitor4. _WaitSet5. _EntryList6. ObjectWaiter1. 作用2. 底层实现原理3. 对象头4. 总结参考synchronized——java多线程锁的关键字1. 作用多线程情况下,同步代码的互斥访问有效的解决了共享变量的可见性问题...

weixin_39631649的博客 297

多线程安全——synchronized原理

synchronized 它可以把任意一个非 NULL 的对象当作锁。他属于独占式的悲观锁,同时属于可重 入锁。 作用范围 1. 作用于方法时,锁住的是对象的实例(this); 2. 当作用于静态方法时,锁住的是Class实例,又因为Class的相关数据存储在永久带PermGen (jdk1.8 则是 metaspace),永久带是全局共享的,因此静态方法锁相当于类的一个全局锁, 会锁所有调用该方法的线程; 3. synchronized 作用于一个对象实例时,锁住的是所有以该对象为锁的代码块。

城南孔乙己的专栏 4462

关于synchronized的Monitor Object机制的研究

这是一道面试题 Synchronized 介绍 monitor Object 设计模式 Monitor(java多线程同步机制) Refer synchronized介绍 synchronized关键字通过修饰一个方法或声明一个代码块,从而产生一个同步对象锁以及对应的同步代码块。 每当有线程要对该同步代码块进行访问时,线程就会首先尝试去获取该对象锁,并在成功获取到对象锁后,对该同步代码

m_xiaoer的博客 9896
上一篇: 多线程教程(六)线程共享带来的问题、synchronized
下一篇: 多线程教程(八)轻量级锁、锁膨胀
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值