代码(可供参考)
public class TextSeckill {
//定义一个共享资源(商品个数)
private static int num = 10;
//打印商品剩余个数
public static void printNum(){
//创建线程
System.out.println("**********" + Thread.currentThread().getName() + "*********");
System.out.println("购买第" + num + "商品");
num--;
//线程等待0.5秒(毫秒)
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
//再次打印线程(释放线程)
System.out.println("**********" + Thread.currentThread().getName() + "*********");
}
public static void main(String[] args) {
//重试连接的策略
/**
* 第一个参数是等待多时秒(毫秒)
* 第二个参数是重试连接多少次
* */
ExponentialBackoffRetry backoffRetry = new ExponentialBackoffRetry(1000, 10);
//创建zookeeper客户端
/**
* connectString()建立连接 "bigdata111"主机名(虚拟机)得windows配置host 没有可以用虚拟机的IP "2181"端口号
* retryPolicy重试连接策略
* */
CuratorFramework client = CuratorFrameworkFactory.builder().connectString("bigdata111:2181").retryPolicy(backoffRetry).build();
//启动客户端
client.start();
//在zookeeper里生成一个锁-->在zookeeper里创建一个znode节点
final InterProcessMutex lock = new InterProcessMutex(client, "/mylock");
//启动10线程
for (int i = 0;i < 10;i++){
new Thread(new Runnable() {
public void run() {
//请求得到一个锁
try {
lock.acquire();
//访问共享资源,购买商品
printNum();
} catch (Exception e) {
e.printStackTrace();
}finally {
//释放锁
try {
lock.release();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}).start();
}
}
}
依赖

包

运行结果示意图
