zookeeper使用场景-分布式锁

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.

 

 

 

 

 

 

转载于:https://my.oschina.net/u/3613309/blog/1613595

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值