基于zookeeper 实现分布式读写锁( 思路 + 代码 )

本文介绍了如何基于Zookeeper实现分布式读写锁。首先解释了分布式锁的必要性和读写锁的概念,接着详细阐述了利用Zookeeper创建锁节点、获取锁以及判断锁状态的思路,并给出了具体的代码实现。最后,通过一个测试案例展示了多个客户端并发获取读写锁的流程。
摘要由CSDN通过智能技术生成

基于zookeeper 实现分布式读写锁

分布式锁

如果不同的系统或一个系统的不同主机共享了一组资源,那么访问这些资源的时候,就需要通过一些互斥的手段来防止彼此之间的干扰,以保证一致性,在这种情况下,就需要使用分布式锁了。

读写锁

读写锁是同一时刻可以允许多个读操作访问,但是在写操作访问时,所有的读操作和其他写操作均被阻塞。Java 并发包提供的读写锁实现是ReentantReadWriteLock

分布式读写锁思路

下面我们介绍基于zookeeper 如何实现分布式读写锁:

如何定义锁节点:

通过zookeeper 上的数据节点来表示一个锁,比如:/lock/请求类型-顺序号。这个节点是临时节点,其后的序号由zookeeper 顺序生成,代表zookeeper 节点的全局唯一顺序,例如/lock/READ-00000001 就表示一个类型为读的分布式锁。zookeeper 节点结构如下:

如何获取锁:

在获取锁时,客户端到/lock 节点下创建一个临时顺序节点,如果是读,就创建一个形如/lock/READ- 的临时顺序节点,然后zookeeper 会返回一个完整的节点,形如/lock/READ-00000002 的带有顺序号的临时节点,这个节点就代表着你将要获取的锁。

判断是否得到锁:

如果是写锁:

  1. 获取/lock 下的子节点
  2. 按照顺序号排序
  3. 检查此写锁之前是否还有其他锁,若有先注册对该写锁前一个锁的监听,然后阻塞该写锁获取,若监听到该写锁前一个锁已释放,则该写锁打开阻塞。

如果是读锁:

  1. 获取/lock 下的子节点
  2. 按照顺序号排序
  3. 检查此读锁之前是否有写锁,若有先注册对该读锁的前一个写锁的监听,然后阻塞该读锁的获取。若监听到该读锁前一个写锁已释放,则该读锁打开阻塞。

分布式读写锁代码实现

public final class DLock
{
    private ZkClient zkClient;
    priva
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值