Java并发编程:AQS中的waitStatus解析

需积分: 1 0 下载量 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锁的工作原理,有助于优化并发程序的性能和正确性。