项目背景:
web进行sql编辑的时候,只能有一个客户端进行编辑,不允许多个客户端同时修改。
相关说明:
- 浏览器端会为每个sql编辑客户端生成唯一标识:时间戳+随机数+用户工号
- 当用户尝试编辑时,需要获取该任务的特定ZK节点下的锁(排它锁)
- 采用 Curator 的 InterProcessMutex 实现全局可重入锁
demo说明:
InterProcessMutexE : 全局可重入的锁(可以多次获取,不会被阻塞)
参考:
几种分布式锁实现:http://www.hollischuang.com/archives/1716
Curator 分布式锁: https://www.cnblogs.com/LiZhiW/p/4931577.html#_label2
ZooKeeper典型应用场景:分布式锁 https://baijiahao.baidu.com/s?id=1610572906386264645&wfr=spider&for=pc
项目不同客户端是排它锁的体现,故使用 InterProcessMutex 实现全局可重入锁
InterProcessMutexE:实现全局可重入锁,非阻塞
/**
* 实现全局可重入锁,非阻塞
*/
public class InterProcessMutexE {
public static void main(String[] args) throws Exception {
CuratorFramework client = CuratorFrameworkFactory.newClient(new TestingServer().getConnectString(), new RetryOneTime(1000));
client.start();
for (int i = 0; i < 50; i++) {
new Thread(() -> {
InterProcessMutex lock = new InterProcessMutex(client, "/d-lock");
String threadName = Thread.currentThread().getName();
try {
System.err.println("[" + threadName + "] 尝试获取锁...");
lock.acquire();
} catch (Exception e) {
e.printStackTrace();
}
System.err.println("[" + threadName + "] 获得锁...");
try {
System.err.println("5秒 执行中...");
Thread.sleep(1000 * 5);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.err.println("[" + threadName + "] 执行完,释放锁...");
try {
lock.release();
} catch (Exception e) {
e.printStackTrace();
}
System.err.println("[" + threadName + "] -------------- 释放成功 --------------");
}).start();
}
}
}