输出倒逼输入系列之 阻塞 or 等待?

news2025/1/15 15:06:03

操作系统线程状态

《趣谈Linux 操作系统》第12章节,讲到 进程的数据结构,其中涉及到任务状态,这里简单概述一下

首先在操作系统中,不管是进程还是线程,都统一是 任务的概念,它的数据结构 为 task_strcut。

任务在执行期间,会伴随着好几个状态,在数据结构中,用 一个 long state 变量 表示,且 state 是通过 bitset 的方式设置的,一位表示一个状态

大概的状态有 :

1 Task_Running

2 Task_Interruptible

3 Task_Uninterruptible

4 Task_killable

5 Task_Stopped

6 Exit

其中 2 ,3,4 都为 睡眠状态,区别在于对于信号的响应能力不一样,可被信号中断,不可被信号中断

从上述状态可知,底层操作系统可大致分为三个状态阶段

运行 -- > 挂起(运行一半,歇一会儿) --> 结束

JVM 中线程的状态

JVM 使用 特定的数据结构 来管理线程状态,每个 线程对象都包含一个状态字段

JVM 定义的线程状态 与 底层 操作系统 还是有区别的

如图所示,类比 java 中的线程状态分为:

1 运行状态

2 阻塞状态

3 等待状态

4 超时等待状态

5 终止状态

阻塞状态

其中 2 阻塞状态,一般是指 使用了 Synchrnized 关键字。它的底层实现原理为,在操作系统的共享内存临界区加锁保护,一次只能一个线程进入。阻塞时,线程不一定进入睡眠状态,可能一直在自旋,或者被提交给操作系统挂起,这里又涉及 Synchronized 轻量级锁 和 重量级锁的概念

这里我觉得可以通俗的翻译为,抢夺资源中

这里贴一段 synchronized 底层实现逻辑:

每个 Java 对象都有一个 关联的 Monitor 对象,也称为 监视器锁 和 内置锁,这个 monitor 对象在 JVM中管理着对象的同步和互斥访问

当一个线程进入 一个 synchronized 代码块或方法时,它会尝试获取该对象的 Monitor对象锁,这个Monitor对象锁可以被视为共享资源,在底层操作系统中,Mutex 提供了共享资源互斥访问的同步机制

等待状态

3 waiting 状态,就是提交给操作系统,挂起或睡眠的操作

真正的挂起,用得比较多的是,LockSupport 工具 提供的 park() 方法

底层不同操作系统提供的方法不一样,但都是使线程 进入睡眠状态

对应的唤醒方法为 unpark() ,用于 唤醒沉睡的线程

java 并发编程里常见的线程暂停一会儿的方法有:

sleep()

wait()

await()等

都是 进入睡眠状态,等待被唤醒或中断

这里详细解说下 sleep() 和 wait():

sleep 是 直接调用操作系统提供的方法,进行挂起

而 wait 是由 JVM 的内部机制实现的线程的等待和唤醒,即进入某个对象的Monitor 对象的等待队列,然后间接的调用操作系统的 挂起方法,这样可以避免线程忙等待

其他状态

4 超时等待状态 ,就是定时唤醒线程,结束睡眠状态 即可

点题

操作系统内核没有阻塞的概念,它的阻塞意思为“挂起”,“睡眠”状态

在JVM 层面,对于线程的状态,多了一个比较显眼的状态,为 BLOCKED,这依赖于底层的 Mutex 锁等同步机制,来保护临界区代码的互斥访问。

JVM 在 操作系统的 底层实现上,自定义加工了 自己的状态,更满足日常使用

重点,区分JVM中 阻塞 和 等待状态的区别,阻塞其实研究到底,是也有可能会被挂起的,他最终也会演变成等待状态

有趣的现象

阻塞状态 是线程阻塞在 进入 Synchronized 关键字修饰的方法或代码块是的状态,但是阻塞在 java concurrent 包中 Lock接口的线程状态却是等待状态,因为Lock它对于阻塞的实现 均使用了 Locksupport 类中的 park 方法,它的阻塞实现,其实就是 等待状态

再聊聊 Lock

之前Synchronized 关键字,涉及到底层操作系统调用,显得复杂笨重,不好控制。

Lock 出现的背景,就是希望在代码设计层面,维护一个简单的共享资源,多个线程围绕着这个资源,进行抢夺且更新资源状态,再配合 使用LockSupport 类中的方法,按需挂起线程。

这样可以更灵活和扩展性更大

AQS(抽象队列同步器) 是这个设计的核心要点

它的内部维护一个一个 同步状态 state 和一个 同步队列

同步状态表示共享资源的状态,同步队列是一个双向链表,用来存储抢夺资源且未抢到的线程

简单介绍一下AQS 实现原理:

如图所示:

Lock 运用巧妙的数据结构 + park 挂起线程操作,达到线程同步的效果,与 Synchronized 的阻塞核心概念完全不同

总结

通过几个案例简单解释了 阻塞 和等待区别与联系,希望大家对线程在不同场景的状态会更了解,更清楚,bingo!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/885283.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深度学习1:通过模型评价指标优化训练

P(Positive)表示预测为正样本,N(negative)表示预测为负样本,T(True)表示预测正确,F(False)表示预测错误。 TP:正样本预测正确的数量(正确检测) FP:负样本预测正确数量(误检测) TN…

Python入门--安装和环境配置

要开始使用Python,您需要先安装Python环境。下面是安装Python环境的简单步骤: 1.访问Python官网(https://www.python.org/),点击“下载”按钮。 2.选择适合您系统的版本下载,可选择Windows、macOS、Linux…

uniapp中map使用点聚合渲染marker覆盖物

效果如图: 一、什么是点聚合 当地图上需要展示的标记点 marker 过多时,可能会导致界面上 marker 出现压盖,展示不全,并导致整体性能变差。针对此类问题,推出点聚合能力。 点聚合官网教程 二、基本用法 template…

如何让CSDN学习成就个人能力六边形全是100分:解析个人能力雷达图的窍门

🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…

【Linux C】在sprintf中打印双引号

0x00 前言 最后更新日期:2023.8.16 0x01 在sprintf中打印双引号 在字符串中有双引号”的地方前面加上一个反斜杠“\”即可,例如: char szProQuery[256] {0}; char name[256] "XiaoMing"; sprintf(szProQuery,"%s said :…

使用druid连接池对配置文件密码进行加密

想让别人看不到你的数据库密码该怎么办呢&#xff1f;&#xff1f;&#xff1f; 1.建立maven项目添加依赖。 <dependencies><!-- com.mysql/mysql-connector-j --><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j…

MyBatis速成

一、MyBatis简介 1、基本概念 MyBatis是一个持久层框架&#xff0c;用于简化JDBC开发。 表现层&#xff1a;页面展示&#xff1b; 业务层&#xff08;service&#xff09;&#xff1a;逻辑处理&#xff1b; 持久层&#xff08;dao&#xff09;&#xff1a;将数据保存到…

Access开发ERP简单主框架搭建

哈喽,哈喽,大家好! 今天我们接着来讲ERP,我们已经把理论知识与表结构讲完了,接下去我们开始讲最关键的业务部分的开发,这里也是大家最期待的。这里我们将会把系统分成几个部分来讲解,包括整个系统基本模块、基础信息、销售管理、采购管理、生产管理、仓库管理。今天的话…

微信小游戏投放量增长五倍,下半年买量能怎么玩?

App中运行小游戏的技术价值和业务价值都是显著的&#xff1a;通过小程序容器技术&#xff0c;承载多样化的小游戏运行在自有App内&#xff0c;实现跨平台的游戏资源共享&#xff0c;降低买量成本&#xff0c;此为「降本」。进一步的&#xff0c;在App内快速引入多小游戏应用&am…

载入内存,让程序运行起来

如果你的电脑上安装了QQ&#xff0c;你希望和好友聊天&#xff0c;会双击QQ图标&#xff0c;打开QQ软件&#xff0c;输入账号和密码&#xff0c;然后登录就可以了。 那么&#xff0c;QQ是怎么运行起来的呢&#xff1f; 首先&#xff0c;有一点你要明确&#xff0c;你安装的QQ软…

智能数据建模软件DTEmpower 2023R2新版本功能介绍

DTEmpower是由天洑软件自主研发的一款通用的智能数据建模软件&#xff0c;致力于帮助工程师及工科专业学生&#xff0c;利用工业领域中的仿真、试验、测量等各类数据进行挖掘分析&#xff0c;建立高质量的数据模型&#xff0c;实现快速设计评估、实时仿真预测、系统参数预警、设…

哪个品牌的触控笔质量好?学生党电容笔选购推荐

相信不少学生党都开始为开学而作准备了&#xff0c;然而电容笔一直都受学生党的广泛喜爱。苹果的Pencil&#xff0c;在性能上确实非常的优秀&#xff0c;但价格却非常的昂贵&#xff0c;一般人根本用不起。现在市面上出现了许多价格便宜、易用的平替电容笔&#xff0c;所以受到…

图文详解Vue slot和slot-scope的用法和区别

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

APSIM模型参数优化 批量模拟丨气象数据准备、物候发育和光合生产、物质分配与产量模拟、土壤水分平衡算法、土壤碳氮平衡模块、农田管理模块等

随着数字农业和智慧农业的发展&#xff0c;基于过程的农业生产系统模型在模拟作物对气候变化的响应与适应、农田管理优化、作物品种和株型筛选、农田固碳和温室气体排放等领域扮演着越来越重要的作用。APSIM (Agricultural Production Systems sIMulator)模型是世界知名的作物生…

陈可之油画|艺术|夔门,好一个天然门户!

《吉祥夔门》 尺寸&#xff1a;56x86cm 陈可之2009年绘 “赤甲白盐俱刺天&#xff0c;闾阎缭绕接山巅。”“夔子巴峡冲&#xff0c;风物异蜀境。”古老的夔门由于其独特的地貌&#xff0c;留下了好多万古流芳的诗句。而陈可之先生&#xff0c;踏足三峡二十余载&#xff0c;用画…

轻松合并视频并添文案,一键让你的作品更出彩

在这个视觉时代&#xff0c;视频已成为展现个性、传递信息的重要方式。你是否经常为了合并多段视频而烦恼&#xff1f;是否苦于缺乏文案添加工具&#xff1f;别担心&#xff01;我们带来了一款强大的视频剪辑工具&#xff0c;让你的创意无处不展现&#xff01; 首先第一步&…

Nginx代理功能与负载均衡详解

序言 Nginx的代理功能与负载均衡功能是最常被用到的&#xff0c;关于nginx的基本语法常识与配置已在上篇文章中有说明&#xff0c;这篇就开门见山&#xff0c;先描述一些关于代理功能的配置&#xff0c;再说明负载均衡详细。 Nginx代理服务的配置说明 1、上一篇中我们在http…

SpringBoot第37讲:SpringBoot数据库管理 - 用Liquibase对数据库管理和迁移

SpringBoot第37讲&#xff1a;SpringBoot数据库管理 - 用Liquibase对数据库管理和迁移 Liquibase是一个用于跟踪、管理和应用数据库变化的开源工具&#xff0c;通过日志文件(changelog)的形式记录数据库的变更(changeset)&#xff0c;然后执行日志文件中的修改&#xff0c;将数…

JavaScript进阶 第三天

编程思想构造函数原型 一.编程思想 面向过程&#xff1a;分析出解决问题所需要的步骤&#xff0c;然后利用函数把这些步骤一步一步实现&#xff0c;使用的时候再一个一个依次调用就可以了&#xff08;按照步骤划分&#xff09;面向对象&#xff1a;把事务分解成一个个对象&…

网络通信原理IP头部格式(第四十二课)

字段作用解析:1)版本: 指的IP地址的版本 (IPv4 或 IPV6)2)首部长度: 次数据包的首部长度一共是多少,没有加可选项3)优先级与服务类型:表示****数据包是否需要优选传递4)总长度: 表示的是整个数据包的大小,也就****是首部+数据5)标识符、标志、段偏移量:的作用将拆开的…