java线程的阻塞和等待的区别

什么是Java线程的阻塞状态?

Java的线程阻塞状态:BLOCKED

复制代码
BLOCKED   The thread is blocked waiting for a monitor lock.

线程需要的内部锁,被另外一个线程持有,这个线程拿不到,就进入了BLOCKED状态。具体讲,在程序执行到synchronized(obj){ }代码块时,还没有获取到监视器锁,就进入了BLOCKED状态。

什么是monitor lock?

根据官方文档中关于monitor lock的介绍,

同步是围绕一个称为内部锁或监视器锁的内部实体构建的。(API规范通常将这个实体简单地称为"监视器"。)内部锁在同步的两个方面都发挥着作用:强制对对象状态的独占访问,以及建立对可见性至关重要的先发生后发生的关系。

每个对象都有一个与之关联的内部锁。按照惯例,需要对对象字段进行独占和一致访问的线程必须在访问它们之前获取对象的内部锁,然后在访问完成后释放内部锁。线程在获取锁和释放锁之间拥有固有锁。只要一个线程拥有一个内部锁,其他线程就无法获取相同的锁。当另一个线程试图获取锁时,它将阻塞。

monitor lock翻译为监视器锁,也称内部锁。还有一些别名,例如对象锁。

那什么是线程的等待状态了?

WAITING

The thread is waiting indefinitely for another thread to perform a particular action.

该线程无限期地等待另一个线程执行特定操作。

线程阻塞和等待有什么区别?

阻塞是没有获取监视器锁,等待是还没有被唤醒。被唤醒后进入阻塞态。一个简易的图,可以梳理阻塞状态和等待状态之间的关系。

线程调用sleep(time)方法后,进入什么状态?

TIMED_WAITING

常见调用方法 调用后线程状态 备注
Thread.sleep(2000) TIMED_WAITING
Object.wait(2000) TIMED_WAITING
Thread.join(2000) TIMED_WAITING
Object.wait() WAITING
Thread.join() WAITING
LockSupport.park() WAITING
Object.notify() BLOCKED 获得监视器锁后,变为RUNNABLE状态
Object.notifyAll() BLOCKED 获得监视器锁后,变为RUNNABLE状态

Thread.sleep(time)和Object.wait(time)有什么区别?

  • 执行了Object.wait(time)方法的线程,释放了监视器锁,但是执行Thread.sleep(time)的线程,并没有释放监视器锁。

关于Java线程的疑问,还要许多,后续的文章再继续研究吧。

本文相关的官方文档:
对象的monitor lock,也就是监视器锁
哪些方法可以让线程进入对应的状态
Object.wait(time)方法解释

相关推荐
tedcloud1231 分钟前
OpenLogi 怎么搭建?用 Rust 打造一个轻量的 Logitech 外设管理工具
linux·运维·服务器·开发语言·后端·rust·开源
霸道流氓气质13 分钟前
Spring AI 技术细节:VectorStore 多库统一抽象
java·人工智能·spring
今天AI了吗14 分钟前
Codex 配置自定义 AI API 完整指南:从零到一接入你的专属模型
java·人工智能·python·数据分析·embedding
Tanjia_kiki19 分钟前
谷歌浏览器中F12编辑并重发请求
开发语言·前端·javascript
程序猿编码22 分钟前
基于GGML的C++17轻量化语音推理引擎:说话人识别与语音分析技术全解析
开发语言·c++·pytorch·深度学习·神经网络·大模型
学长毕业设计34 分钟前
基于SpringBoot的健康食谱管理系统的设计与实现(源码+文档+讲解视频)
java·spring boot·后端
珍珠先生35 分钟前
P10 · 缺 MySQL 驱动 jar:ClassNotFoundException: com.mysql.cj.jdbc.Driver
java
pnoker1 小时前
从工业软件到 AI 智能体:工业 AIoT 技术路线的系统梳理
java·人工智能·物联网·microsoft·开源·工业互联网
传奇开心果编程1 小时前
【Rust入门知识点学与练】第5课:函数
开发语言·学习·rust
秋田君1 小时前
Qt_QMediaPlayer类与QMediaPlaylist类
开发语言·qt