互站网源码网站,打开qq邮箱进入wordpress,青州网站建设青州,河北网站seo外包核心思想#xff1a;当客户端要获取锁#xff0c;则创建节点#xff0c;使用完锁#xff0c;则删除该节点。
客户端获取锁时#xff0c;在 lock 节点下创建临时顺序节点。然后获取 lock下面的所有子节点#xff0c;客户端获取到所有的子节点之后#xff0c;如果发现自己…核心思想当客户端要获取锁则创建节点使用完锁则删除该节点。
客户端获取锁时在 lock 节点下创建临时顺序节点。然后获取 lock下面的所有子节点客户端获取到所有的子节点之后如果发现自己创建的子节点序号最小那么就认为该客户端获取到了锁。使用完锁后将该节点删除。如果发现自己创建的节点并非 lock所有子节点中最小的说明自己还没有获取到锁。此时客户端需要找到比自己小的那个节点同时对其注册事件监听器监听删除事件。如果发现比自己小的那个节点被删除则客户端的 Watcher 会收到相应通知此时再次判断自己创建的节点是否是 lock 子节点中序号最小的如果是则获取到了锁如果不是则重复以上步骤继续获取到比自己小的一个节点并注册监听。
Curator 实现分布式锁 API
在 Curator 中有五种锁方案 InterProcessSemaphoreMutex分布式排它锁非可重入锁 InterProcessMutex分布式可重入排它锁 InterProcessReadWriteLock分布式读写锁 InterProcessMultiLock将多个锁作为单个实体管理的容器 InterProcessSemaphoreV2共享信号量
package com.itheima.curator;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;import java.util.concurrent.TimeUnit;//以线程的方式模拟卖票
public class Ticket12306 implements Runnable{private int tickets 10;//数据库的票数private InterProcessMutex lock ;public Ticket12306(){RetryPolicy retryPolicy new ExponentialBackoffRetry(3000, 10);CuratorFramework client CuratorFrameworkFactory.builder().connectString(192.168.2.212:2181).sessionTimeoutMs(60 * 1000).connectionTimeoutMs(15 * 1000).retryPolicy(retryPolicy).build();//开启连接client.start();lock new InterProcessMutex(client,/lock);}Overridepublic void run() {while(true){//获取锁try {lock.acquire(3, TimeUnit.SECONDS);if(tickets 0){System.out.println(Thread.currentThread():tickets);Thread.sleep(100);tickets--;}} catch (Exception e) {e.printStackTrace();}finally {//释放锁try {lock.release();} catch (Exception e) {e.printStackTrace();}}}}
}
package com.itheima.curator;public class LockTest {public static void main(String[] args) {Ticket12306 ticket12306 new Ticket12306();//创建客户端Thread t1 new Thread(ticket12306,携程);Thread t2 new Thread(ticket12306,飞猪);t1.start();t2.start();}}
代码很简单可靠性都是zookeeper内部帮你做好的。直接 lock new InterProcessMutex(client,“/lock”);创建锁对象就行