1. Curator 框架的 InterProcessMutex 分布式锁实现
请详细说明 Apache Curator 框架中 InterProcessMutex 分布式可重入锁的实现原理,包括锁节点的创建、排队机制、Watch 监听与锁释放的完整流程?
- Curator 分布式锁的锁节点模型(临时顺序节点)
- 获取锁的竞态与 Watch 监听机制
- 可重入锁的计数与线程绑定
InterProcessMutex 基于 ZooKeeper 的临时顺序节点实现。加锁时,客户端在指定锁路径下创建临时顺序节点(EPHEMERAL_SEQUENTIAL),然后获取该路径下所有子节点列表并排序,判断自己创建的节点是否为最小节点。如果是最小节点,则成功获取锁;否则监听前一个比自己小的节点(而不是监听所有节点,避免"惊群效应"),当监听到前一个节点被删除后重新判断。释放锁时删除自己的临时节点,其 Watch 会触发后一个节点获得锁。InterProcessMutex 支持可重入,内部维护一个 ConcurrentMap 记录当前线程的锁计数,同一线程重复加锁时计数递增,只有计数归零才真正删除节点。
采用"监听前一个节点"而非"监听所有节点"是避免惊群效应的关键,只有相邻的节点才会被唤醒,保证了锁获取的公平性(FIFO)。临时节点+Watch 的组合保证了即使客户端崩溃,锁也会在会话过期时自动释放,避免死锁。可重入性由线程本地计数实现,与 Java 的 ReentrantLock 语义一致。