1

我们的项目严重依赖分布式锁。我知道curator提供了几种锁。我的问题是,我可以将创建节点用作互斥体吗?

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异常。如果这行不通,我想知道原因。

4

1 回答 1

1

我认为反对按照您的建议做的第一个反对意见是很难阅读/理解代码,将其与:

InterProcessSemaphoreMutex lock = new InterProcessSemaphoreMutex(client, path);
lock.acquire();

另一个原因是您通常使用锁来阻塞一个线程,直到另一个线程释放锁,这样您就可以编写如下所示的代码:

//do normal work
...
lock.acquire();
//do critical single threaded work
...
lock.release();
//back to normal work
...

您的代码完全可以做到这一点,但在这里它是为您创建的。


使用已经实现的锁而不是自己编写锁的原因还有很多,但它主要归结为:“为什么要重新发明轮子?”

于 2016-02-19T15:24:48.190 回答