Zookeeper分布式入门——ZK分布式锁的简单实现
使用InterProcessMutex实现java
InterProcessMutex基于Zookeeper实现了分布式的公平可重入互斥锁,相似于单个JVM进程内的ReentrantLockapache
private static InterProcessMutex mutex = new InterProcessMutex(client, "/curator/lock");分布式
//得到了锁 public static boolean acquire(long time, TimeUnit unit){ try { return mutex.acquire(time,unit); } catch (Exception e) { e.printStackTrace(); return false; } }
//释放锁 public static void release(){ try { mutex.release(); } catch (Exception e) { e.printStackTrace(); } }
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import org.apache.curator.RetryPolicy; import org.apache.curator.framework.CuratorFramework; import org.apache.curator.framework.CuratorFrameworkFactory; import org.apache.curator.framework.recipes.locks.InterProcessMutex; import org.apache.curator.retry.ExponentialBackoffRetry; /** * 基于curator的zookeeper分布式锁 * 这里咱们开启5个线程,每一个线程获取锁的最大等待时间为5秒,为了模拟具体业务场景,方法中设置4秒等待时间。 * */ public class CuratorUtil { private static String address = "192.168.12.101:2181"; public static void main(String[] args) { //一、重试策略:初试时间为1s 重试3次 RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3); //二、经过工厂建立链接 CuratorFramework client = CuratorFrameworkFactory.newClient(address, retryPolicy); //三、开启链接 client.start(); //4 分布式锁 final InterProcessMutex mutex = new InterProcessMutex(client, "/curator/lock"); //读写锁 //InterProcessReadWriteLock readWriteLock = new InterProcessReadWriteLock(client, "/readwriter"); ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5); for (int i = 0; i < 5; i++) { fixedThreadPool.submit(new Runnable() { @Override public void run() { boolean flag = false; try { //尝试获取锁,最多等待5秒 flag = mutex.acquire(5, TimeUnit.SECONDS); Thread currentThread = Thread.currentThread(); if(flag){ System.out.println("线程"+currentThread.getId()+"获取锁成功"); }else{ System.out.println("线程"+currentThread.getId()+"获取锁失败"); } //模拟业务逻辑,延时4秒 Thread.sleep(4000); } catch (Exception e) { e.printStackTrace(); } finally{ if(flag){ try { mutex.release(); } catch (Exception e) { e.printStackTrace(); } } } } }); } } }
这里咱们开启5个线程,每一个线程获取锁的最大等待时间为5秒,为了模拟具体业务场景,方法中设置4秒等待时间。开始执行main方法,经过ZooInspector监控/curator/lock下的节点以下图:ide
对,没错,设置4秒的业务处理时长就是为了观察生成了几个顺序节点。果真如案例中所述,每一个线程都会生成一个节点而且仍是有序的。观察控制台,咱们会发现只有两个线程获取锁成功,另外三个线程超时获取锁失败会自动删除节点。线程执行完毕咱们刷新一下/curator/lock节点,发现刚才建立的五个子节点已经不存在了。测试