请选择 进入手机版 | 继续访问电脑版

12360技术网 - 专业IT技术发表平台

 立即注册  找回密码
查看: 8271|回复: 3

zookeeper和curator实现的分布式锁

[复制链接]

18

主题

25

帖子

211

积分

中级会员

Rank: 3Rank: 3

积分
211
发表于 2020-1-26 19:06:09 | 显示全部楼层 |阅读模式
文章目录


【一】介绍

分布式锁简介:
1.1 什么是锁

在单机环境下,当存在多个线程可以同时改变某个共享变量时,就需要同步来实现该功能,使其线程安全。
而同步就是通过锁来实现的。锁保证了同一时刻只有一个线程来修改共享变量。
在单机环境下,Java提供了一些并发安全包可以一定程度上保证线程安全,但是在分布式环境(多机环境)下,这些并发包显得就无能为力了!!
1.2 什么是分布式

分布式的CAP理论:
任何一个分布式系统都无法同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance),最多只能同时满足两项。
目前很多大型网站及应用都是分布式部署的,分布式场景中的数据一致性问题一直是一个比较重要的话题。基于 CAP理论,很多系统在设计之初就要对这三者做出取舍。在互联网领域的绝大多数的场景中,都需要牺牲强一致性来换取系统的高可用性,系统往往只需要保证最终一致性。
3、什么是分布式锁
顾名思义,分布式锁肯定是用在分布式环境下。在分布式环境下,使用分布式锁的目的也是保证同一时刻只有一个线程来修改共享变量,修改共享缓存……。
1.3  分布式锁特性

1、在分布式系统环境下,一个方法在同一时间只能被一个机器的一个线程执行;
2、高可用的获取锁与释放锁;
3、高性能的获取锁与释放锁;
4、具备可重入特性;
5、具备锁失效机制,防止死锁;
6、具备非阻塞锁特性,即没有获取到锁将直接返回获取锁失败

【二】curator介绍




  • public void acquire();//获取锁
  • public boolean acquire(long time, TimeUnit unit);//获取锁,可以指定阻塞时间
  • public void release();//释放锁
  • boolean isAcquiredInThisProcess();//判断当前是否持有锁,实际使用中,如果持有锁,可以进行锁的释放
实现类:
  1. InterProcessMultiLock 将多个锁作为单个实体管理的容器InterProcessMutex 分布式可重入排它锁InterProcessReadWriteLock 分布式读写锁InterProcessSemaphoreMutex 分布式排它锁InterProcessSemaphoreV2 信号量
复制代码

【三】代码实现
  1. package com.provider.demo.comment;import org.apache.curator.framework.CuratorFramework;import org.apache.curator.framework.CuratorFrameworkFactory;import org.apache.curator.framework.recipes.locks.InterProcessMutex;import org.apache.curator.retry.ExponentialBackoffRetry;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import java.util.concurrent.TimeUnit;/** * @Description * @Author fengwen * @Date 2020/1/22 18:12 * @Version V1.0 */public class DistributedLock {    public static Logger log = LoggerFactory.getLogger(DistributedLock.class);    //可重入排它锁    private InterProcessMutex interProcessMutex;    //竞争资源标志    private String lockName;    //根节点    private String root = "/distributed/lock/";    private static CuratorFramework curatorFramework;    private static String ZK_URL = "127.0.0.1:2181";    static{        curatorFramework= CuratorFrameworkFactory.newClient(ZK_URL,new ExponentialBackoffRetry(1000,3));        curatorFramework.start();    }    /**     * 实例化     * @param lockName     */    public DistributedLock(String lockName){        try {            this.lockName = lockName;            interProcessMutex = new InterProcessMutex(curatorFramework, root + lockName);        }catch (Exception e){            log.error("initial InterProcessMutex exception="+e);        }    }    /**     * 获取锁     */    public void acquireLock(){        try {            //重试2次,每次最大等待2s,也就是最大等待4s            while (true){                boolean acquire = interProcessMutex.acquire(2, TimeUnit.SECONDS);                if (acquire){                    log.info("Thread:"+Thread.currentThread().getId()+" acquire distributed lock  success");                    break;                }            }        } catch (Exception e) {            log.error("distributed lock acquire exception="+e);        }    }    /**     * 释放锁     */    public void releaseLock(){        try {            if(interProcessMutex != null && interProcessMutex.isAcquiredInThisProcess()){                interProcessMutex.release();                curatorFramework.delete().inBackground().forPath(root+lockName);                log.info("Thread:"+Thread.currentThread().getId()+" release distributed lock  success");            }        }catch (Exception e){            log.info("Thread:"+Thread.currentThread().getId()+" release distributed lock  exception="+e);        }    }}
复制代码
【四】链接

                                                                                                                                       
                                                    
  • 点赞                        
  • 收藏                        
  • 分享                                                                                                                        
  •                                                         
                                      
    • 文章举报                           
                                                
                                                                        
                                            
                                                        wenge1477                                                                发布了130 篇原创文章 · 获赞 88 · 访问量 2万+                                                                                            私信                                                            关注
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x




上一篇:Hadoop环境搭建之本地运行模式
下一篇:#树莓派#使用QT实现串口信息检测与网络通信
回复

使用道具 举报

10

主题

23

帖子

313

积分

中级会员

Rank: 3Rank: 3

积分
313
发表于 2020-2-11 00:41:46 | 显示全部楼层
这东西我收了!谢谢楼主![www.12360.co]
回复

使用道具 举报

0

主题

20

帖子

430

积分

中级会员

Rank: 3Rank: 3

积分
430
发表于 6 天前 | 显示全部楼层
这个帖子不回对不起自己![www.12360.co]
回复

使用道具 举报

0

主题

7

帖子

157

积分

注册会员

Rank: 2

积分
157
发表于 4 天前 | 显示全部楼层
楼主,大恩不言谢了![www.12360.co]
回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

12360技术网

GMT+8, 2020-2-29 20:46 , Processed in 0.110698 second(s), 41 queries .

本网站内容收集于互联网,Www.12360.Co不承担任何由于内容的合法性及健康性所引起的争议和法律责任。 欢迎大家对网站内容侵犯版权等不合法和不健康行为进行监督和举报。

© 2019-2020 Www.12360.Co

快速回复 返回顶部 返回列表