1,获得锁
public boolean lock(CuratorFramework client, int expireTime, String path) {
boolean isLock = false;
if (client == null) {
isLock = false;
}
InterProcessMutex lock = new InterProcessMutex(client, path);
try {
isLock = lock.acquire(expireTime, TimeUnit.SECONDS);
} catch (Exception e) {
logger.error("lock error", e);
isLock = false;
}
return isLock;
}
2,释放锁
public void unlock(CuratorFramework client, String path) {
if (client == null) {
return;
}
InterProcessMutex unlock = new InterProcessMutex(client, path);
try {
unlock.release();
} catch (Exception e) {
logger.error("unlock error", e);
}
}
获取锁核心实现代码如下:
private boolean internalLock(long time, TimeUnit unit) throws Exception
{
Thread currentThread = Thread.currentThread();
/***
查看在当前缓存中是否存在
**/
LockData lockData = threadData.get(currentThread);
if ( lockData != null )
{
// re-entering
lockData.lockCount.incrementAndGet();
return true;
}
/***
尝试获取锁
***/
String lockPath = internals.attemptLock(time, unit, getLockNodeBytes());
if ( lockPath != null )
{
LockData newLockData = new LockData(currentThread, lockPath);
threadData.put(currentThread, newLockData);
return true;
}
return false;
}
LockData是 InterProcessMutex 的一个静态内部类
private static class LockData
{
final Thread owningThread;
final String lockPath;
final AtomicInteger lockCount = new AtomicInteger(1);
private LockData(Thread owningThread, String lockPath)
{
this.owningThread = owningThread;
this.lockPath = lockPath;
}
}
属性
owningThread 当前线程
lockPath 当前zk监控的namespace
lockCount 当前线程锁的调用数
核心代码在于 internals.attemptLock 这个方法
一直不停监控该namespace.