zookeeper 分布式锁
实现原理:多个进程在同一个目录节点下注册临时顺序节点,节点顺序最小则获得锁,否则进行等待;当获取锁的进程运行结束释放锁或者故障临时节点自动删除时,其余进程可尝试获取锁
******************************
引入 jar 包
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.2.0</version>
</dependency>
******************************
相关类
public class InterProcessMutex implements InterProcessLock, Revocable<InterProcessMutex>
****************************
构造方法
public InterProcessMutex(CuratorFramework client, String path)
public InterProcessMutex(CuratorFramework client, String path, LockInternalsDriver driver)
****************************
常用方法
public void acquire() throws Exception //获得锁
public boolean acquire(long time, TimeUnit unit) throws Exception
//指定时间间隔内获取锁
public void release() throws Exception //释放锁
******************************
使用示例
*******************
config 层
@Configuration
public class ZookeeperConfig {
@Value("${zookeeper.connecting-string}")
private String connectingString;
@Bean
public CuratorFramework initCuratorFramework(){
CuratorFramework curatorFramework= CuratorFrameworkFactory.builder()
.connectString(connectingString)
.sessionTimeoutMs(5000)
.retryPolicy(new ExponentialBackoffRetry(1000,3,3000))
.namespace("test")
.build();
curatorFramework.start();
return curatorFramework;
}
}
*******************
controller 层
@RestController
public class HelloController {
@Autowired
private CuratorFramework curatorFramework;
private String lockPath="/lock";
@RequestMapping("/test")
public String hello(){
InterProcessMutex mutex=new InterProcessMutex(curatorFramework,lockPath);
ExecutorService executorService= Executors.newFixedThreadPool(5);
for(int i=0;i<5;i++){
executorService.submit(() -> {
try{
mutex.acquire();
System.out.println(Thread.currentThread().getId()+"获得锁"+System.currentTimeMillis());
Thread.sleep(1000);
System.out.println(Thread.currentThread().getId()+"执行完毕");
}catch (Exception e){
e.printStackTrace();
}finally {
try{
System.out.println(Thread.currentThread().getId()+"释放锁"+System.currentTimeMillis());
System.out.println();
mutex.release();
}catch (Exception e){
e.printStackTrace();
}
}
});
}
return "success";
}
}
****************************
控制台输出
70获得锁1569155723666
70执行完毕
70释放锁1569155724666
67获得锁1569155724688
67执行完毕
67释放锁1569155725693
69获得锁1569155725703
69执行完毕
69释放锁1569155726705
68获得锁1569155726720
68执行完毕
68释放锁1569155727722
71获得锁1569155727726
71执行完毕
71释放锁1569155728729
537

被折叠的 条评论
为什么被折叠?



