引入依赖
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator‐recipes</artifactId>
<version>5.2.0</version>
</dependency>
代码:
public int outOfWarehouseWithLock() throws Exception {
//设置ZK客户端重试策略, 每隔1秒重试一次,最多重试3次
RetryPolicy policy = new ExponentialBackoffRetry(1000, 3);
//创建ZK客户端,连接到Zookeeper服务器
CuratorFramework client = CuratorFrameworkFactory.builder().connectString("ip:2181").retryPolicy(policy).build();
//创建与Zookeeper服务器的连接
client.start();
//声明锁对象,本质就是ZK顺序临时节点
final InterProcessMutex mutex = new InterProcessMutex(client, "/locks/wh-shoe");
try {
//请求锁,创建锁
mutex.acquire();
//处理业务逻辑
if (WarehouseService.shoe > 0) {
Thread.sleep(500);
//扣减库存
return --WarehouseService.shoe;
} else {
//库存不足,
throw new RuntimeException("库存不足");
}
} finally {
//释放锁
mutex.release();
}
}