Java 基础(3)—synchornized 关键字简单理解
一、synchronized 修饰同步代码块
用 synchronized 修饰代码段作为同步锁,代码如下:
public class LockDemo {public Object object = new Object();public void show(){synchronized (object) {System.out.println(">>>>>>hello world!");}}public static void main(String[] args) {new LockDemo().show();}
}
直接运行 main() 方法让 LockDemo 类编译下,然后定位到具体 LockDemo.class 类文件路径处,通过 javap 指令查看底层代码,如下:
javap -c LockDemo.class

从上图中发现底层是由 monitorenter、monitorexit 去实现同步操作的。
但是这里会发现一个 monitorenter 对应着两个 monitorexit,按理加锁和解锁不应该是两个操作么? 怎么来了两个解锁?其实这样设计是为了保证出现异常时能够把锁释放,不会让程序卡死。但是并不是一定是1:2,比如如下代码:
public class LockDemo {public Object object = new Object();public void show(){synchronized (object) {System.out.println(">>>>>>hello world!");throw new RuntimeException(">>>>>>异常");}}public static void main(String[] args) {new LockDemo().show();}
}
通过 javap 命令查看如下图示:

通过 athrow 一直把异常抛到最外层,然后最后 monitorexit 释放锁。总结一句话就是:synchornized 锁是一对出现的,但是为了能够在异常环境下锁能够释放,加了善尾处理。
二、synchornized 修改方法
代码如下:
public class LockDemo {public Object object = new Object();public void show(){synchronized (object) {synchronized (this) {System.out.println(">>>>>>hello world!");}}}public static synchronized void sop() {}public static void main(String[] args) {new LockDemo().show();}
}
通过 javap -v LockDemo.class 命令查看字节码,如下图示:
提示:通过 java -v Xxx 查看到更全面的信息

方法级别的同步是隐形的,无须通过字节码指令控制,它实现在方法调用和返回操作之中。虚拟机可以从方法常量池中方法表结构中的 ACC_SYNCHRONIZED 方法标识得知这个方法是否声明为同步方法,调用时,调用指令会检查方法的 ACC_SYNCHRONIZED 访问标识符是否被设置,如果设置,执行线程就需要先成功持有 Montior 管程,然后才能够执行该方法,其他线程都无法获取到同一个管程。如果同步方法在运行期间抛出异常,且在方法内无法处理,那这个同步方法所持有的管程将在异常抛出到同步方法边界之外自动释放。
三、什么是 Monitor 监视器?
在 HotSpot 虚拟机中,Monitor 是一种用于实现同步的机制。Monitor 可以确保在多线程环境下,同一时间只有一个线程可以访问临界区(即共享资源),从而保证线程安全。
在 Java 中,每个对象都有一个 Monitor,可以通过 synchronized 关键字来获得该对象的 Monitor。当线程进入 synchronized 块时,它会尝试获取对象的 Monitor,如果该 Monitor 正在被其他线程持有,则当前线程将被阻塞,直到 Monitor 可用。当线程退出 synchronized 块时,它将释放对象的 Monitor,这样其他线程就可以获取 Monitor 并进入 synchronized 块。
以下是一个简单的示例,演示了如何使用 synchronized 关键字获取对象的 Monitor,以保证线程安全:
class Counter {private int count = 0;public synchronized void increment() {count++;}public synchronized void decrement() {count--;}public synchronized int getCount() {return count;}
}class Main {public static void main(String[] args) {Counter counter = new Counter();// 创建 1000 个线程,每个线程分别执行 1000 次增加和减少操作for (int i = 0; i < 1000; i++) {new Thread(() -> {for (int j = 0; j < 1000; j++) {counter.increment();counter.decrement();}}).start();}// 等待所有线程执行完毕try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}// 输出最终计数器的值System.out.println(counter.getCount()); // 0}
}
在上面的代码中,我们创建了一个名为 Counter 的类,它包含一个计数器变量 count 和三个同步方法 increment()、decrement() 和 getCount()。在这些方法中,我们使用 synchronized 关键字获取对象的 Monitor,以确保在多线程环境下对计数器的操作是线程安全的。
在主方法中,我们创建了 1000 个线程,每个线程分别执行 1000 次增加和减少操作,从而对计数器进行了大量的并发修改。最后,我们输出计数器的值,期望得到 0,以确保所有操作都是正确的。
Monitor 底层采用 ObjectMonitor.cpp jvm 实现,并且每个对象都是天生带着一个 Monitor 监视器。
看到初始化 ObjectMonitor 构造方法,源码如下图示:

| 属性 | 属性描述 |
|---|---|
| _owner | 指向持有 ObjectMonitor 对象的线程 |
| -WaitSet | 存放处于 wait 状态的线程队列 |
| _EntryList | 存放处于等待锁 block 状态的线程队列 |
| _recursions | 锁重入次数 |
| _count | 用来记录该线程获取锁的次数 |
相关文章:
Java 基础(3)—synchornized 关键字简单理解
一、synchronized 修饰同步代码块 用 synchronized 修饰代码段作为同步锁,代码如下: public class LockDemo {public Object object new Object();public void show(){synchronized (object) {System.out.println(">>>>>>hell…...
【Linux】调试工具gdb的使用
环境:centos7.6,腾讯云服务器Linux文章都放在了专栏:【Linux】欢迎支持订阅🌹前言在前文,我们已经讲解了vim工具以及gcc/g的使用,我们可以进行编写代码以及编译代码了,但是还没有学习如何在Linu…...
大数据知识图谱项目——基于知识图谱的医疗知识问答系统(详细讲解及源码)
基于知识图谱的医疗知识问答系统 一、项目概述 本项目基于医疗方面知识的问答,通过搭建一个医疗领域知识图谱,并以该知识图谱完成自动问答与分析服务。本项目以neo4j作为存储,基于传统规则的方式完成了知识问答,并最终以关键词执…...
威马汽车:跃马扬鞭未竟,鞍马劳顿难行?
“活下去,像牲口一样地活下去。” 威马汽车创始人、董事长兼CEO沈晖1月在社交媒体上分享的电影台词,已然成为威马近况的真实写照。 来源:新浪微博威马汽车沈晖Freeman 最近,网上出现了大量关于“威马汽车将实施全员停薪留职”的…...
【网络】网络基础
🥁作者: 华丞臧. 📕专栏:【网络】 各位读者老爷如果觉得博主写的不错,请诸位多多支持(点赞收藏关注)。如果有错误的地方,欢迎在评论区指出。 推荐一款刷题网站 👉 LeetCode刷题网站 文章…...
Linux系统之Uboot、Kernel、Busybox思考之三
目录 三 内核的运行 5-中断子系统 6 锁、延迟与原子上下文 7 内存管理子系统 8 驱动的两类框架 三 内核的运行 5-中断子系统 中断子系统的数据结构及设计思想。 中断子系统需要解决中断管理的问题。 如果系统中断较少的话,其管理就不用设计这样一个中断子系统这…...
FPGA 20个例程篇:20.USB2.0/RS232/LAN控制并行DAC输出任意频率正弦波、梯形波、三角波、方波(一)
在最后一个例程中笔者精挑细选了一个较为综合性的项目实战,其中覆盖了很多知识点,也是从一个转产产品中所提炼出来的,所以非常贴近实战项目。 整个工程实现了用户通过对上位机PC端人机界面的操作,即可达到控制豌豆开发并行DAC输出…...
性能测试学习和性能瓶颈分析路线
很多企业招聘都只写性能测试,会使用LR,jmeter工具。其实会使用jmeter和LR进行性能测试还只是性能测试的第一步,离真正的性能测试工程师还很远,笔者也还在路上 .。 性能测试,都是要求测试系统性能,系统自然…...
达梦数据库(DM8)集成使用 Geoserver(2.22.2) 以及其他对应版本详解
达梦数据库(DM8)集成使用 Geoserver(2.22.2) 以及其他对应版本详解系统环境版本Geoserver 驱动对应版本达梦 8 集成 Geoserver 过程试错过程问题总结项目需要国产化,选择使用达梦数据库,在技术测试阶段&…...
全开源无加密的RuleApp文章社区APP客户端源码
内容目录一、详细介绍二、效果展示1.部分代码2.效果图展示三、学习资料下载一、详细介绍 开源无加密的文章社区客户端源码分享 RuleApp文章社区,VIP会员,写作投稿积分商城,付费模块集成,多平台兼容这是一款开源免费,界…...
基于springboot校园二手市场平台
一、项目简介 本项目是一套基于springboot校园二手市场平台,主要针对计算机相关专业的正在做bishe的学生和需要项目实战练习的Java学习者。 包含:项目源码、数据库脚本等,该项目可以直接作为bishe使用。 项目都经过严格调试,确保…...
维度建模基本流程总结
一、维度建模基本流程图数据RD进行业务调研和数据现状调研,产出符合相关模版规范的业务知识文档和数据现状文档。数据PM也会调研相关业务产出需求设计文档,三方参与需求评审,评审通过后基建数据RD进行需求拆解,产出技术方案&#…...
RocketMQ事务消息
RocketMQ事务消息 RocketMq提供的一种高级消息类型,支持在分布式场景下面保障消息生产和本地事务的一致性 生产者将消息发送到服务端服务端将消息持久化成功后,向生产者返回ACK确认消息发送成功,此时消息状态为待投递,这种状态下的消息称之为…...
大数据处理 - 双层桶划分
分桶法简介其实本质上还是分而治之的思想,重在“分”的技巧上!适用范围: 第k大,中位数,不重复或重复的数字基本原理及要点: 因为元素范围很大,不能利用直接寻址表,所以通过多次划分,逐步确定范围…...
NFC标签读写器隐私协议
【标签读写器】(以下简称“我们”)深知个人信息对您的重要性,并会尽全力保护您的个人信息安全可靠。我们致力于维持您对我们的信任,恪守以下原则,保护您的个人信息:权责一致原则、目的明确原则、选择同意原…...
DocEE:一种用于文档级事件抽取的大规模细粒度基准 论文解读
DocEE: A Large-Scale and Fine-grained Benchmark for Document-level Event Extraction 论文:NAACL2022.pdf (tongmeihan1995.github.io) 代码:tongmeihan1995/DocEE: DocEE: A Large-Scale and Fine-grained Benchmark for Document-level Event Ext…...
ImageCombiner设计源码详解
前言在前面的博客中介绍了一款Java的海报生成器ImageCombiner,原文地址:拿来就用的Java海报生成器ImageCombiner(一),在博文中简单介绍了一下代码以及一个真实的生成案例。但是对源码的介绍不多,本文就针对源码进行深入…...
python基础 | python基础语法
文章目录📚基础语法🐇输入和输出🥕print()输出🥕input()输入🐇 变量的命名🐇条件判断🥕单向判断🥕双向判断🥕多向判断🥕if嵌套🥕三元表达式&#…...
YOLOv6-3.0-目标检测论文解读
文章目录摘要算法2.1网络设计2.2Anchor辅助训练2.3自蒸馏实验消融实验结论论文: 《YOLOv6 v3.0: A Full-Scale Reloading 》github: https://github.com/meituan/YOLOv6上版本参考 YOLOv6摘要 YOLOv6 v3.0中YOLOv6-N达到37.5AP,1187FPS&…...
JAVA集合之Map >>HashMap/Hashtable/TreeMap/LinkedHashMap结构
Map 是一种键-值对(key-value)集合,键不可以重复,值可以重复。常见的实现类有:HashMap、Hashtable、TreeMap、LinkedHashMap等。 HashMap&Hashtable HashMap:数据结构为哈希表,允许使用 n…...
【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...
GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...
