先看代码截图

screenshot

semaphore.acquire会在lease.close后返回,返回后,同时有两个线程都在对this.lease变量进行修改,所以外面的acquire方法在返回true时,this.lease变量有可能是null的!!!

于是在接下来的release时是无法把之前获取到的lease对象进行lease.close的,这个锁永远的丢了。

这个问题在最新的curator-recipes上都依旧存在:InterProcessSemaphoreMutex.java

<dependency>
    <groupId>org.apache.curator</groupId>
    <artifactId>curator-recipes</artifactId>
    <version>3.2.1</version>
</dependency>

修改的方法很简单,先上代码:

screenshot

注意到,我先把this.lease变为局部变量,然后立刻把this.lease设为null释放掉,接着再去调用lease.close,这样this.lease这个变量就始终只有一个线程在修改,线程安全了。

问题及相关补丁已经报告给社区:CURATOR-376