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…...

(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...

LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...

NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...

Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...
JavaScript 数据类型详解
JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...