【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 文本到图像模型套件,该套件定义了文本到…...
谷粒商城实战笔记-127-全文检索-ElasticSearch-整合-测试复杂检索
文章目录 一,使用Elasticsearch的Java RESTHighLevel Client完成复杂的查询请求1. 创建检索请求 (SearchRequest)2. 构造检索条件 (SearchSourceBuilder)3. 执行检索 (SearchResponse)4. 处理解析结果5. 获取聚合信息 二,AI时代的效率提升 一,…...
解锁PyCharm:破解依赖库导入之谜
解锁PyCharm:破解依赖库导入之谜 PyCharm作为Python开发者的强大IDE,提供了丰富的功能来简化开发流程。然而,在使用过程中,开发者可能会遇到导入依赖库时出现的错误。本文将深入探讨PyCharm中导入依赖库报错的问题,并…...
JSON-Viewer插件:json格式查看器
npm install vue-json-viewer 2,main.js 引入 import JsonViewer from vue-json-viewer Vue.use(JsonViewer) 3,组件里写入这个组件 <json-viewer:value"textSecond":expand-depth"5"copyableboxedsort></json-viewer…...
HDFS块信息异常,spark无法读取数据
背景:flume数据落盘到hdfs上时,正在写入的文件一般是以.log.tmp结尾的文件,当flume将文件关闭以后将变为:.log 结尾的文件。由于我们使用阿里云的服务器,经常会有个别节点挂掉(进程在,无法通信,…...
TCP协议概述
TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。它由IETF的RFC 793定义,并在各种通信系统中广泛应用,为不同但互连的计算机通信网络的主计算机中的成对进程之…...
SpringSecurity-3(认证和授权+SpringSecurity入门案例+自定义认证+数据库认证)
SpringSecurity使用数据库数据完成认证 5 SpringSecurity使用数据库数据完成认证5.1 认证流程分析5.1.1 UsernamePasswordAuthenticationFilter5.1.2 AuthenticationManager5.1.3 AbstractUserDetailsAuthenticationProvider5.1.4 AbstractUserDetailsAuthenticationProvider中…...
英国AI大学排名
计算机学科英国Top10 “计算机科学与信息系统”学科除了最受关注的“计算机科学”专业,还包括了“人工智能”“软件工程”“计算机金融”等众多分支专业。 1.帝国理工学院 Imperial College London 单以计算机专业本科来讲,仅Computing这个专业&#x…...
渗透测试与高级攻防技术(二)网络安全技术的前沿探讨:渗透测试与高级攻防
文章目录 引言 第一章:入侵检测与防御系统(IDS/IPS)1.1 IDS与IPS的区别1.2 Cisco IDS/IPS系统 第二章:蜜罐技术2.1 蜜罐技术概述2.2 搭建蜜罐系统2.3 蜜罐技术的优缺点 第三章:社会工程攻击3.1 社会工程攻击概述3.2 社…...
Windows系统下安装mujoco环境的教程【原创】
在学习Mujoco仿真的过程中,我先前是在linux系统下进行的研究与学习,今天来试试看在windows系统中安装mujoco仿真环境。 先前在linux中的一些关于mujoco学习记录的博客:Mujoco仿真【xml文件的学习 3】_mujoco打开xml文件-CSDN博客 下面开始wi…...
【秋招笔试】2024-08-03-科大讯飞秋招笔试题(算法岗)-三语言题解(CPP/Python/Java)
🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 编程一对一辅导 ✨ 本系列打算持续跟新 秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🍖 本次题目难度中等偏上,最后一题又是…...
乌克兰网站后缀/推广产品的方法和步骤
开源操作系统就是公开源代码的操作系统软件,可以遵循开源协议(GNU)进行使用、编译和再发布。在遵守GNU协议的前提下,任何人都可以免费使用,随意控制软件的运行方式。意思很简单就是系统的源代码是面向用户开放的&#…...
做调查的网站推荐/sem百度竞价推广
采用Spring管理Bean和依赖注入 1.实例化spring容器 和 从容器获取Bean对象 实例化Spring容器常用的两种方式: 方法一: 在类路径下寻找配置文件来实例化容器 [推荐使用] ApplicationContext appContext new ClassPathXmlApplicationContext("classpath*:/META-…...
廉洁四川官方网权威发布/汕头seo推广外包
本文为美国罗切斯特理工学院(作者:Sandeep Aswath Narayana)的硕士论文,共56页。 硅工艺技术的不断改进使得在单个芯片上集成数百个核成为可能。然而,功耗和散热已经成为设计这些大规模多核芯片的主要限制,…...
宁波网站怎么建设/搜索引擎收录查询工具
大家好,我是小鸭酱,博客地址为:http://www.cnblogs.com/xiaoyajiang pyAudioAnalysis是一个音频分析python库,用于Feature Extraction, Classification, Segmentation 和Applications,其github见 https://github.com/t…...
电脑怎么下免费wordpress/广州seo网络推广员
有关51单片机中断的形式和C语言编程格式void INT0()interrupt 0 using 1 {.... ..... } interrupt 0 指明是外部中断0; interrupt 1 指明是定时器中断0; interrupt 2 指明是外部中断1; interrupt 3 指明是定时器中断1; interrupt …...
上海网站建设哪家/管理微信软件
**众所周知IE浏览器不兼容<input type"date">的html5时间插件,**下面介绍一种支持IE浏览器的jquery时间插件, 1.先引入jquery:<link rel"stylesheet" href"common/css/dcalendar.picker.css"/> &l…...