我们的项目严重依赖于分布式锁定。我知道策展人提供了几种锁。我的问题是,我可以将创建节点用作互斥锁吗?
CuratorFramework zkClient = zookeeperConnectionProvider.getZkClientForJobDistributeLock();
try {
zkClient.create()
.creatingParentsIfNeeded()
.withMode(CreateMode.EPHEMERAL)
.forPath("/" + job.getIdentifier().jobNodeString());
LOGGER.info(String.format("create node in zookeeper [%s]", job.getIdentifier().jobNodeString()));
} catch (Exception e) {
LOGGER.info(String.format("create job instance node in zookeeper failed [%s], reason [%s]",
job.getIdentifier().jobNodeString(),
e.getClass().getCanonicalName()));
return NO_WORK;
}
当第一个进程成功创建时,第二个进程获得
NodeExistsException
例外。如果这不起作用,我想知道原因。
答案 0 :(得分:0)
我认为第一个反对你提出建议的反对意见是,难以阅读/理解代码,将其与以下内容进行比较:
InterProcessSemaphoreMutex lock = new InterProcessSemaphoreMutex(client, path);
lock.acquire();
另一个原因是你通常使用锁来阻塞一个线程,直到另一个线程释放锁,这样你就可以编写如下代码:
//do normal work
...
lock.acquire();
//do critical single threaded work
...
lock.release();
//back to normal work
...
您的代码可以通过哪种方式实现,但这里是为您创建的。
使用已经实现的锁定而不是编写自己的锁定有很多理由,但它主要归结为:'为什么重新发明轮子?"