原理1,创建节点(临时顺序的节点)
2,使用节点
3,删除节点
(创建的节点里面,最小的拿来作为锁,非最小的节点找到比他小的节点设置监听删除事件)
代码如下:
引入依赖
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-client</artifactId>
<version>4.0.0</version>
</dependency>
public class Ticket implements Runnable{
private Integer ticket=10;
//InterProcessMutex 可重入
private InterProcessMutex lock;
public Ticket(){
//获取连接
RetryPolicy retryPolicy=new ExponentialBackoffRetry(3000,10);
CuratorFramework client= CuratorFrameworkFactory.builder()
.connectString("139.155.174.161:2181")
.sessionTimeoutMs(60 * 1000)
.connectionTimeoutMs(15 * 1000)
.retryPolicy(retryPolicy)
.build();
client.start();
//获取锁
lock=new InterProcessMutex(client,"/lock");
}
@Override
public void run() {
while (true){
try {
//使用锁
lock.acquire();
if(ticket>0) {
System.out.println(Thread.currentThread() + ":" + ticket);
ticket--;
Thread.sleep(3000);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
//释放锁
lock.release();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}