Curator
是ZooKeeper
的一個客戶端框架,其中封裝了分布式互斥鎖
的實現,最為常用的是InterProcessMutex
,本文將對其進行代碼剖析
簡介
InterProcessMutex
基於Zookeeper
實現了分布式的公平可重入互斥鎖
,類似於單個JVM進程內的ReentrantLock(fair=true)
構造函數
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
|
獲取鎖
InterProcessMutex.acquire
InterProcessMutex.internalLock
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
private boolean internalLock(long time, TimeUnit unit) throws Exception{ Thread currentThread = Thread.currentThread(); LockData lockData = threadData.get(currentThread); if ( lockData != null ){ |
LockInternals.attemptLock
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
|
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
|
LockInternals.internalLockLoop
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
|
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
|
|
釋放鎖
弄明白了獲取鎖的原理,釋放鎖的邏輯就很清晰了
InterProcessMutex.release
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
|
public void release() throws Exception{ Thread currentThread = Thread.currentThread(); LockData lockData = threadData.get(currentThread); if ( lockData == null ){ |
LockInternals.releaseLock
1 2 3 4 5
|
void releaseLock(String lockPath) throws Exception{ revocable.set(null); |
總結
InterProcessMutex
的特性
- 分布式鎖(基於
Zookeeper
)
- 互斥鎖
- 公平鎖(
監聽上一臨時順序節點
+ wait() / notifyAll()
)
- 可重入