ZooKeeper学习笔记—共享锁

众所周知,在Java开发中,要创建一个单进程锁非常简单,使用JDK中自带的java.util.concurrent.locks.Lock接口即可实现锁的功能。

如今已经到了大数据、云的时代,而这种锁已经无法满足集群服务间锁的需求了,本文将简单说下如何使用ZooKeeper来实现共享锁功能。至于什么是共享锁呢?理解起来也很简单:就是指在多个实例中使用同一把锁。(我好像废话了……)

同样闪亮登场的还是我们的Curator Framework,它封装了各种场景的锁,比如:共享锁、读写锁、可撤销锁等。

LockStartup.java

package org.bigmouth.common.zookeeper.shared;
 
import java.util.concurrent.TimeUnit;
 
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.recipes.locks.InterProcessSemaphoreMutex;
import org.bigmouth.common.zookeeper.config.ZooKeeperFactory;
 
 
public class LockStartup {
 
    public static void main(String[] args) throws Exception {
        CuratorFramework client = ZooKeeperFactory.get(); // ZooKeeperFactory在上一篇文章《ZooKeeper学习笔记—配置管理》中有
        final InterProcessSemaphoreMutex processSemaphoreMutex = new InterProcessSemaphoreMutex(client, "/lock");
        printProcess(processSemaphoreMutex);
         
        System.out.println("Starting get lock...");
        boolean flag = processSemaphoreMutex.acquire(12, TimeUnit.SECONDS);
        System.out.println(flag ? "Getting lock successful." : "Getting failed!");
         
        printProcess(processSemaphoreMutex);
         
        Thread.sleep(20 * 1000);
         
        if (processSemaphoreMutex.isAcquiredInThisProcess()) {
            processSemaphoreMutex.release();
        }
        printProcess(processSemaphoreMutex);
        client.close();
    }
     
    private static void printProcess(final InterProcessSemaphoreMutex processSemaphoreMutex) {
        // 在本进程中锁是否激活(是否正在执行)
        System.out.println("isAcquiredInThisProcess: " + processSemaphoreMutex.isAcquiredInThisProcess());
    }
 
}



启动LockStartup,得到如下结果:

接着再启动一个LockStartup实例,结果是无法获取到锁。程序还是会等待12秒,如果12秒后仍然无法获取到锁则结束:

如果我们把处理时间设置为10秒,等待时间为12秒。那么当第一个进程释放后,第二个进程将会获取到锁。

Thread.sleep(10 * 1000);
还有适合其他场景的共享锁就不一一做例子了,使用起来都类似。可以看下接口org.apache.curator.framework.recipes.locks.InterProcessLock的实现类。

转载于:https://my.oschina.net/boltwu/blog/464155

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值