ZooKeeper 分布式锁 Curator 源码之二:可重入锁重复加锁和锁释放

大数据 分布式
当锁需要释放的时候,只需要调用 lock.release() 进行释放即可,具体是如何释放的呢?

[[410320]]

前言

加锁逻辑已经介绍完毕,那当一个线程重复加锁是如何处理的呢?

1.锁重入

在上一小节中,可以看到加锁的过程,再回头看 internalLock 这个方法。

加锁成功之后,将当前线程放到 threadData 中,threadData 是 ConcurrentMap

假如锁重入了,直接就会在上一部分 lockData != null 被拦下,然后执行 lockData.lockCount.incrementAndGet();。

对 lockCount 自增,代表了锁重入。

这里发现了吧!Curator 的锁重入是在 Java 代码中实现的。

2.锁释放

当锁需要释放的时候,只需要调用 lock.release() 进行释放即可,具体是如何释放的呢?

主要分为两部分:

  1. 递减 threadData 中当前线程的加锁次数;
  2. 加锁次数大于 0,说明还剩余重入次数,直接返回;
  3. 加锁次数等于 0,则 releaseLock 释放锁,并删除 threadData 中当前线程 key。

releaseLock 方法中就没有多少复杂逻辑了,就是移除监听器,删除临时顺序节点。也就是 /locks/lock_01/_c_e855d232-c636-4241-bf8e-f047939a5833-lock-0000000001。

3.总结

ZooKeeper 的 InterProcessMutex 锁是通过 Java 代码中维护了一个 lockCount 来判断是否重入的。

本文转载自微信公众号「程序员小航」,可以通过以下二维码关注。转载本文请联系程序员小航公众号。

 

责任编辑:武晓燕 来源: 程序员小航
相关推荐

2021-07-10 10:02:30

ZooKeeperCurator并发

2021-07-08 09:21:17

ZooKeeper分布式锁 Curator

2021-06-27 21:24:55

RedissonJava数据

2021-07-16 07:57:34

ZooKeeperCurator源码

2021-07-03 17:45:57

分布式Redisson MultiLock

2021-06-30 14:56:12

Redisson分布式公平锁

2021-07-02 08:51:09

Redisson分布式锁公平锁

2021-07-01 09:42:08

Redisson分布式

2021-06-28 10:51:55

Redisson分布式锁Watchdog

2021-07-06 08:37:29

Redisson分布式

2021-10-25 10:21:59

ZK分布式锁ZooKeeper

2017-10-24 11:28:23

Zookeeper分布式锁架构

2024-01-30 08:41:33

线程执行Redis分布式锁

2022-01-14 08:35:58

Curator分布式锁Zookeeper

2020-06-15 08:15:47

分布式锁系统

2020-11-16 12:55:41

Redis分布式锁Zookeeper

2021-02-28 07:49:28

Zookeeper分布式

2019-07-16 09:22:10

RedisZookeeper分布式锁

2018-11-27 16:17:13

分布式Tomcat

2021-11-26 06:43:19

Java分布式
点赞
收藏

51CTO技术栈公众号