Java并发编程:AQS中的waitStatus解析
需积分: 1 191 浏览量
更新于2024-08-03
收藏 5KB MD 举报
"Java基础笔记-8-26,涵盖了Java并发编程中关于AQS(AbstractQueuedSynchronizer)的waitStatus属性及其含义,CLH锁的工作原理和抢占锁的过程。"
在Java并发编程中,AQS(AbstractQueuedSynchronizer)是一个重要的抽象类,用于构建锁和同步器的基础组件。它维护了一个内部节点结构,每个节点代表一个等待的线程,节点之间通过waitStatus属性来传递和管理状态信息。
1. waitStatus属性:
- CANCELLED (1):当线程节点的waitStatus值为1时,表示该线程已经被取消。这通常是因为线程被中断或者等待超时,需要从等待队列中移除。节点进入取消状态后,将不再参与同步状态的竞争。
- SIGNAL (-1):如果waitStatus为SIGNAL,意味着后续节点正等待当前节点的释放。当当前节点释放同步状态或被取消,会唤醒其后续节点,允许它们继续执行。
- CONDITION (-2):当waitStatus是-2时,表明线程在条件队列中等待。当某个条件满足时(如调用condition的signal()方法),节点会从条件队列转移到同步队列,以便重新竞争锁。
- PROPAGATE (-3):在共享模式下,当一个线程获取到共享锁后,如果waitStatus为-3,它会无条件地传播锁的获取状态,使得后续的共享节点可以直接获取锁,加速锁的释放和获取过程。
- 0:初始状态,表示线程刚刚进入队列,还没有发生任何特殊状态变化。
2. threadNode和nextWaiter成员:
- Node的thread成员保存了进入AQS队列的线程引用,这样可以跟踪哪个线程正在等待同步状态。
- nextWaiter成员通常在节点处于条件等待队列时使用,它指向后继等待节点,便于进行条件唤醒操作。
3. CLH锁原理:
- CLH(Craig, Landin, and Hagersten)锁是一种自旋锁实现,它将等待的线程插入到一个FIFO队列中。当线程想要获取锁时,它会在队尾创建一个节点,并尝试获取锁。
- 抢占锁的过程包括:线程创建一个带有locked标志为true的新节点,表示它需要获取锁;然后,线程会自旋地检查前驱节点的状态,一旦前驱节点释放锁,当前线程就可获取锁并更新状态。
这部分内容深入讲解了Java并发编程中的核心概念,对于理解和实现高级并发控制机制,如ReentrantLock、Semaphore等,都是非常关键的知识点。理解waitStatus的状态机以及CLH锁的工作原理,有助于优化并发程序的性能和正确性。
2023-12-10 上传
好教员好
- 粉丝: 1231
- 资源: 40
最新资源
- A Structured P2P Overlay Based on Harmonic Series
- 基于JSP的毕业论文设计-B/S模式
- WCF框架入门(面向初学者)
- gps的基本原理、通讯码制及定位应用
- 垂直搜索 verticle searching
- MS SQL SERVER2005 SP1镜像高可用性实施手册
- 常用芯片89C51英文资料
- SQL SERVER、ACCESS和EXCEL数据转换
- adempiere安装教程
- linux Ubuntu部落中文版pdf
- SPSS10课程(统计软件)
- ASP.NET 程式设计基础篇
- Extjs入门教程 Extjs入门教程
- linux Ubuntu从入门到精通中文版pdf
- FY2卫星业务产品释用手册
- Java基础知识练习题