首先引入jar包
<!-- 基于zk的分布式锁-->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>2.7.0</version>
<exclusions>
<exclusion>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</exclusion>
</exclusions>
</dependency>
Curator提供了InterProcessMutex类帮助我们实现分布式锁,内部是实现了临时顺序节点(EPHEMERAL_SEQUENTIAL)
单线程下使用方法 :
//加入zk锁
CuratorFramework client = CuratorFrameworkFactory.newClient(“127.0.0.1:2181”,
new ExponentialBackoffRetry(1000, 3));
client.start();
String lockpath="/temp";
InterProcessMutex lock = new InterProcessMutex(client, lockpath);
try {
//加锁成功
if (lock.acquire(3, TimeUnit.SECONDS)) {
System.out.println("加锁成功");
}else{
System.out.println("加锁失败");
}
} catch (Exception e) {
System.out.println("加锁失败");
} finally {
try {
lock.release();
} catch (Exception e) {
}
CloseableUtils.closeQuietly(client);
}
多线程下使用方法:
public static void main(String args[]) throws Exception {
RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
CuratorFramework client = CuratorFrameworkFactory.newClient("127.0.0.1:2181", retryPolicy);
client.start();
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5);
for (int i = 0; i < 5; i++) {
fixedThreadPool.submit(new Runnable() {
@Override
public void run() {
try {
InterProcessMutex ipm = new InterProcessMutex(client, "/zktest");
try {
ipm.acquire();
System.out.println("Thread ID:" + Thread.currentThread().getId() + " acquire the lock");
Thread.sleep(1000);
System.out.println("Thread ID:" + Thread.currentThread().getId() + " release the lock");
} catch (Exception e) {
} finally {
ipm.release();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
}