Apache Curator的一处经典的线程不安全问题
先看代码截图
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>
修改的方法很简单,先上代码:
注意到,我先把this.lease
变为局部变量,然后立刻把this.lease
设为null
释放掉,接着再去调用lease.close
,这样this.lease
这个变量就始终只有一个线程在修改,线程安全了。
问题及相关补丁已经报告给社区:CURATOR-376