分布式锁的一个成熟框架
创建case3.CuratorLockTest用来测试练习使用框架
在pom.xml中添加依赖
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.3.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.3.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-client</artifactId>
<version>4.3.0</version>
</dependency>
刷新pom.xml,等待依赖包下载完成。
测试类代码
public class CuratorLockTest {
public static void main(String[] args) throws InterruptedException {
//创建分布式锁1
InterProcessMutex lock1 = new InterProcessMutex(getCuratorFramework(), "/lcoks");
//创建分布式锁2
InterProcessMutex lock2 = new InterProcessMutex(getCuratorFramework(), "/lcoks");
new Thread(new Runnable() {
@Override
public void run() {
try {
lock1.acquire();//获取锁
System.out.println("线程1 获取到锁");
lock1.acquire();
System.out.println("线程1 再次获取到锁");
Thread.sleep(5*1000);//线程休眠5秒钟
lock1.release();//释放锁
System.out.println("线程1 释放锁");
lock1.release();
System.out.println("线程1 再次释放锁");
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
Thread.sleep(5*1000);
new Thread(new Runnable() {
@Override
public void run() {
try {
lock2.acquire();//获取锁
System.out.println("线程2 获取到锁");
lock2.acquire();
System.out.println("线程2 再次获取到锁");
Thread.sleep(5*1000);//线程休眠5秒钟
lock2.release();//释放锁
System.out.println("线程2 释放锁");
lock2.release();
System.out.println("线程2 再次释放锁");
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
private static CuratorFramework getCuratorFramework() {
ExponentialBackoffRetry retry = new ExponentialBackoffRetry(3000, 3);//多少秒,重复次数
CuratorFramework client = CuratorFrameworkFactory.builder().connectString("Hadoop003:2181,Hadoop004:2181,Hadoop005:2181")
.connectionTimeoutMs(2000)
.sessionTimeoutMs(2000)
.retryPolicy(retry).build();
client.start();
System.out.println("ZooKeeper 启动成功");
return client;
}
}
InterProcessMutex 分布式锁类;使用时节点先获取锁 acquire,操作完成后release释放锁;其他节点便可以获取到锁。
运行后,观察到只有前一个节点释放锁后,第二个节点才能获取锁。