Curator
是ZooKeeper
的一个客户端框架,其中封装了分布式互斥锁
的实现,最为常用的是InterProcessMutex
,本文将对其进行代码剖析
简介
InterProcessMutex
基于Zookeeper
实现了_分布式的公平可重入互斥锁
_,类似于单个JVM进程内的ReentrantLock(fair=true)
构造函数
1 | // 最常用 |
获取锁
InterProcessMutex.acquire
1 | // 无限等待 |
InterProcessMutex.internalLock
1 | private boolean internalLock(long time, TimeUnit unit) throws Exception{ |
1 | // 映射表 |
1 | // 锁信息 |
LockInternals.attemptLock
1 | // 尝试获取锁,并返回锁对应的Zookeeper临时顺序节点的路径 |
1 | // From StandardLockInternalsDriver |
LockInternals.internalLockLoop
1 | // 循环等待来激活分布式锁,实现锁的公平性 |
1 | // From StandardLockInternalsDriver |
1 | // From LockInternals |
1 | // From LockInternals |
释放锁
弄明白了获取锁的原理,释放锁的逻辑就很清晰了
InterProcessMutex.release
1 | public void release() throws Exception{ |
LockInternals.releaseLock
1 | void releaseLock(String lockPath) throws Exception{ |
1 | // Class:LockInternals |
总结
InterProcessMutex
的特性
- 分布式锁(基于
Zookeeper
) - 互斥锁
- 公平锁(
监听上一临时顺序节点
+wait() / notifyAll()
) - 可重入