【Java】深度解析监视器的组成原理
目录
- 一、什么是监视器(Monitor)
- 二、监视器的组成部分
- 三、线程的状态转换
- 四、总结
一、什么是监视器(Monitor)
在Java中,监视器(Monitor)是用来实现线程同步的一种机制。每个Java对象都有一个与之关联的监视器,线程可以通过synchronized关键字来获取和释放对象的监视器。监视器的主要作用是确保在同一时刻只有一个线程可以执行同步块或同步方法,从而实现线程的互斥访问。
二、监视器的组成部分
监视器通常包含以下三个关键部分:
- 入口集(Entry List):等待获取监视器锁的线程集合。
- 所有者线程(Owner Thread):当前持有监视器锁的线程。
- 等待集(Wait Set):调用了wait()方法并进入等待状态的线程集合。
线程等待的地方
入口集(Entry List):线程在尝试进入同步块或同步方法时,如果无法获取监视器锁,它们会进入入口集等待。这些线程处于阻塞状态,等待获取监视器锁。
等待集(Wait Set):线程在调用wait()方法后,会释放监视器锁并进入等待集。这些线程处于等待状态,直到被其他线程通过notify()或notifyAll()方法唤醒。
三、线程的状态转换
线程状态转换示意图
以下是线程在不同状态之间转换的过程示意图:
- 新建状态(New):线程被创建,但尚未启动。
- 可运行状态(Runnable):线程已经启动,可以运行但不一定正在运行。
- 阻塞状态(Blocked):线程在入口集中,等待获取监视器锁。
- 等待状态(Waiting):线程在等待集中,等待其他线程通过notify()或notifyAll()唤醒。
- 超时等待状态(Timed Waiting):线程在等待集中,等待特定时间后被唤醒。
- 终止状态(Terminated):线程已经结束执行。
示例代码解释
我们通过一个示例代码来解释线程在不同状态之间的转换:
public class MonitorExample {private static final Object lock = new Object();public static void main(String[] args) {Thread thread1 = new Thread(() -> {synchronized (lock) {try {System.out.println("Thread 1: Acquired lock, entering wait state.");lock.wait();System.out.println("Thread 1: Woken up, reacquired lock.");} catch (InterruptedException e) {Thread.currentThread().interrupt();}}});Thread thread2 = new Thread(() -> {synchronized (lock) {System.out.println("Thread 2: Acquired lock, notifying.");lock.notify();System.out.println("Thread 2: Notified, releasing lock.");}});thread1.start();try {Thread.sleep(100); // Ensure thread1 starts first and enters wait state} catch (InterruptedException e) {Thread.currentThread().interrupt();}thread2.start();}
}
过程解释
Thread 1 获取监视器锁:
Thread 1 进入同步块并获取监视器锁。
调用lock.wait()方法,Thread 1释放监视器锁并进入等待集。
Thread 2 获取监视器锁:
Thread 2 进入同步块并获取监视器锁(此时Thread 1已在等待集)。
调用lock.notify()方法,唤醒等待集中的一个线程(即Thread 1)。
Thread 2 释放监视器锁:
Thread 2 退出同步块,释放监视器锁。
Thread 1 重新获取监视器锁:
被唤醒的Thread 1从等待集中移动到锁池,重新竞争获取监视器锁。
Thread 1成功获取监视器锁后,从wait()方法返回,继续执行后续代码。
四、总结
监视器(Monitor):用于实现线程同步,每个Java对象都有一个监视器。
入口集(Entry List):线程在尝试进入同步块或同步方法时,如果无法获取监视器锁,会进入入口集等待。
等待集(Wait Set):线程在调用wait()方法后,会释放监视器锁并进入等待集,等待被唤醒。
状态转换:线程在不同状态之间转换,包括新建、可运行、阻塞、等待、超时等待和终止状态。
相关文章:
【Java】深度解析监视器的组成原理
目录 一、什么是监视器(Monitor)二、监视器的组成部分三、线程的状态转换四、总结 一、什么是监视器(Monitor) 在Java中,监视器(Monitor)是用来实现线程同步的一种机制。每个Java对象都有一个与…...
Day14-Servlet后端验证码的实现
图片验证码的生成采用的是Kaptcha; Kaptcha是一个高度可配置的验证码生成工具,由Google开源。它通过一系列配置文件和插件,实现了将验证码字符串自动转换成图片流,并可以与session进行关联,从而在验证过程中使用&#…...
MySQL:数据库权限与角色
权限 MySQL 的权限管理系统是保障数据库安全性的关键组件之一。它允许数据库管理员精确控制哪些用户可以对哪些数据库对象执行哪些操作。 自主存取控制 DAC(DiscretionaryAccess Control):用户对于不同的数据库对象有不同的存取权限,不同的…...
等保测评练习卷25
等级保护初级测评师试题25 姓名: 成绩: 一、判断题(10110分) 1.安全区域边界对象主要根据系统中网络访问控制设备的部署情况来确定()不是网络访问控制设备而…...
《python语言程序设计》2018第6章第28题 掷骰子 两个色子,分别是1到6
2、3、12 玩家输 7、11玩家赢 4、5、6、8、9、10算1点,之后出7玩家输或者和上一次相同。def rolled(num_t):count 0still_win 0second_win 0still_lose 0second_lose 0while count < num_t:a_1 random.randint(1, 6)b_1 random.randint(1, 6)tTen a_1 b…...
Java方法递归
目录 1.方法递归调用 基本介绍 递归能解决什么问题? 八皇后问题 递归举例 递归重要规则 练习 2.递归调用应用实例-迷宫问题 3.递归调用实例-汉诺塔 4.递归调用实例-八皇后问题 1.方法递归调用 基本介绍 简单来说,递归就是自己调用自己。 …...
目标跟踪那些事
目标跟踪那些事 跟踪与检测的区别 目标跟踪和目标检测是计算机视觉中的两个重要概念,但它们的目的和方法是不同的。 目标检测(object Detection):是指在图像或视频帧中识别并定位一个或多个感兴趣的目标对象的过程 。 目标跟踪(object Tracking)&…...
【Git】 如何将一个分支的某个提交合并到另一个分支
【Git】 如何将一个分支的某个提交合并到另一个分支 在使用 Git 进行版本控制时,常常会遇到这样的需求:将某个分支的特定提交合并到另一个分支中。这种情况下,我们可以使用 cherry-pick 命令来实现。本文将详细介绍 cherry-pick 命令的使用方…...
【嵌入式之RTOS】什么是消息队列
目录 一、FreeRTOS消息队列的基本概念 二、FreeRTOS消息队列的工作原理 三、FreeRTOS消息队列的特点 四、FreeRTOS消息队列的应用 五、示例 消息队列是一种用于任务间通信的机制,它允许一个任务(生产者)向消息队列发送消息,而…...
9-springCloud集成nacos config
本文介绍spring cloud集成nacos config的过程。 0、环境 jdk 1.8maven 3.8.1Idea 2021.1nacos 2.0.3 1、项目结构 根项目nacos-config-sample下有两个module,这两个module分别是两个springboot项目,都从nacos中获取连接mysql的连接参数。我们开工。 …...
市场主流 AI 视频生成技术的迭代路径
AI视频生成技术的迭代路径经历了从GANVAE、Transformer、Diffusion Model到Sora采用的DiT架构(TransformerDiffusion)等多个阶段,每个阶段的技术升级都在视频处理质量上带来了飞跃性的提升。这些技术进步不仅推动了AI视频生成领域的快速发展&…...
移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——1.c++入门(2)
1. 函数重载 C⽀持在同⼀作⽤域中出现同名函数,但是要求这些同名函数的形参不同,可以是参数个数不同或者 类型不同。这样C函数调⽤就表现出了多态⾏为,使⽤更灵活。C语⾔是不⽀持同⼀作⽤域中出现同 名函数的。 #include<iostream> u…...
【Python系列】深入理解 Python 中的 `nonlocal` 关键字
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
Flask目录结构路由重定向简单实例讲解——轻量级的 Python Web 框架
假设一个flask目录结构如下: my_flask_app/ │ ├── app.py ├── routes/ │ ├── __init__.py │ ├── ZhejiangProvince/ │ │ ├── __init__.py │ │ ├── la.py │ │ └── el.py │ ├── GuangdongProvince/ │ │ ├…...
破解PyCharm插件更新难题:让IDE焕发新生
破解PyCharm插件更新难题:让IDE焕发新生 PyCharm作为业界领先的集成开发环境(IDE),其丰富的插件生态是其强大功能的重要来源。然而,插件无法更新的问题可能会困扰许多用户,影响开发体验。本文将详细介绍如…...
cmake常用命令学习
1.include https://blog.csdn.net/qq_38410730/article/details/102677143 CmakeLists.txt才是cmake的正统文件,而.cmake文件是一个模块文件,可以被include到CMakeLists.txt中。 include指令一般用于语句的复用,也就是说,如果有…...
K8S可视化管理平台KubeSphere
什么是 KubeSphere ? KubeSphere 是一款开源项目,在目前主流容器调度平台 Kubernetes 之上构建的企业级分布式多租户容器管理平台,提供简单易用的操作界面以及向导式操作方式,在降低用户使用容器调度平台学习成本的同时ÿ…...
Bugku-CTF-聪明的php
pass a parameter and maybe the flag files filename is random :> 传递一个参数,可能标记文件的文件名是随机的: 于是传一下参,在原网页后面加上/?a1,发现网页出现了变化 3.传入参数,一般情况下是文件包含,或者命令执行&…...
【MySQL进阶】MySQL主从复制
目录 MySQL主从复制 概念 主从形式 一主多从 多主一从 双主复制 主从级联复制 主从复制原理 三个线程 两个日志文件 主从复制的主要工作模式 异步复制 半同步复制 全同步复制 MySQL主从复制 概念 MySQL主从复制是一种数据分布机制,允许从一个数据库服…...
本地部署文生图模型 Flux
本地部署文生图模型 Flux 0. 引言1. 本地部署1-1. 创建虚拟环境1-2. 安装依赖模块1-3. 创建 Web UI1-4. 启动 Web UI1-5. 访问 Web UI 0. 引言 2024年8月1日,blackforestlabs.ai发布了 FLUX.1 模型套件。 FLUX.1 文本到图像模型套件,该套件定义了文本到…...
AI Agent操作系统架构师:Harness Engineer解析
Harness Engineer:AI Agent时代的「系统架构师」,打造可执行可信赖的智能体操作系统引言 当大语言模型从「对话助手」进化为「能干活的AI Agent」,我们发现一个核心矛盾:模型的概率性灵活能力与业务的确定性执行要求始终无法调和。…...
Fast Lab突破:3D激光雷达+强化学习如何重塑无人机自主避障新范式?
1. 当无人机遇上3D激光雷达:一场感知革命 想象一下,你操控的无人机正在茂密的树林中穿行,突然前方出现几根几乎透明的钓鱼线——这种场景会让任何飞手瞬间冒冷汗。传统基于视觉或超声波传感器的无人机就像戴着高度近视眼镜的短跑运动员&#…...
格式排版改到崩溃?高校教授说用这几个AI论文写作工具
论文写作总让人头大?格式排版改到崩溃、文献检索效率低、逻辑结构不清晰……这些痛点你是不是也遇到过?其实,只要用对 AI 工具、走对流程,就能事半功倍。资深教授建议,从选题到降重,全程使用专业工具辅助&a…...
跨地域公司短号互拨实战:用miniSIPServer+SIP话机打通两地分机(含完整号码变换规则)
跨地域企业短号互通实战:基于miniSIPServer的智能路由与号码变换体系 当企业分支机构分布在不同城市时,如何让员工继续沿用熟悉的短号拨号习惯,同时实现主叫号码的规范显示?这个看似简单的需求背后,隐藏着VoIP系统中号…...
Z-Image-Turbo_UI界面场景应用:快速制作电商产品概念图
Z-Image-Turbo_UI界面场景应用:快速制作电商产品概念图 1. 引言:电商产品概念图制作的新选择 在电商行业,产品概念图的制作一直是设计师和运营人员的痛点。传统方式需要专业设计软件和大量时间投入,而Z-Image-Turbo_UI界面提供了…...
Python入门实战:调用MogFace-large完成你的第一个人脸检测程序
Python入门实战:调用MogFace-large完成你的第一个人脸检测程序 你是不是对AI人脸检测感到好奇,但又觉得它离自己很远,需要高深的数学和复杂的代码?今天,我们就来打破这个迷思。我将带你用Python,从一个纯新…...
开源大模型部署新范式:像素幻梦Streamlit前端+diffusers后端架构解析
开源大模型部署新范式:像素幻梦Streamlit前端diffusers后端架构解析 1. 项目概览 像素幻梦(Pixel Dream Workshop)是一款基于FLUX.1-dev扩散模型的像素艺术生成工具,它重新定义了AI艺术创作的用户体验。与传统AI绘图工具不同,它采用了独特的…...
Mac开发者必备:OpenClaw对接Qwen3-32B镜像开发环境配置
Mac开发者必备:OpenClaw对接Qwen3-32B镜像开发环境配置 1. 为什么选择OpenClawQwen3-32B组合 去年我在开发一个自动化文档处理工具时,发现常规的RPA方案无法处理非结构化数据。直到尝试将OpenClaw与Qwen3-32B结合,才真正实现了"理解-决…...
OpenClaw技能市场巡礼:百川2-13B支持的十大实用插件
OpenClaw技能市场巡礼:百川2-13B支持的十大实用插件 1. 为什么需要技能市场? 第一次接触OpenClaw时,我被它"本地化AI助手"的定位吸引,但很快发现原生功能有限——它能操控鼠标键盘、读写文件,但具体到&quo…...
Equalizer APO:在Windows音频处理中实现系统级音效精准调控
Equalizer APO:在Windows音频处理中实现系统级音效精准调控 【免费下载链接】equalizerapo Equalizer APO mirror 项目地址: https://gitcode.com/gh_mirrors/eq/equalizerapo Equalizer APO作为一款开源系统级音频处理引擎,通过Windows音频处理对…...
