zookeeper 分布式锁


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

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值