可重入,内部有计数器 ++ — 到 0 释放锁
可以公平也可以非公平锁
悲观锁
可以tryLock(long timeout, TimeUnit unit) 方法,允许线程在指定时间内尝试获取锁,如果超时则返回 false。
中断响应,允许线程在等待锁的过程中响应中断。
获取锁流程
非公平锁:基于CAS获取锁,拿不到就去AQS队列等待。
AQS 队列
AQS 使用一个 双向链表 来管理等待线程,每个节点是一个 Node 对象:
prev:前驱节点。
next:后继节点。
thread:等待的线程。
waitStatus:节点状态(如 SIGNAL、CANCELLED 等)。
当线程获取锁失败时,会被加入队列尾部,并通过 LockSupport.park() 阻塞。当锁释放时,会唤醒队列头部的线程。
