写点什么

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

发布于: 19 小时前

前言

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

锁重入

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



加锁成功之后,将当前线程放到 threadData 中,threadData 是 ConcurrentMap<Thread, LockData> 类型的,不用担心并发问题。


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


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


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

锁释放

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



主要分为两部分:


  1. 递减 threadData 中当前线程的加锁次数;

  2. 加锁次数大于 0,说明还剩余重入次数,直接返回;

  3. 加锁次数等于 0,则 releaseLock 释放锁,并删除 threadData 中当前线程 key。


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

总结

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


相关推荐

发布于: 19 小时前阅读数: 7
用户头像

个人公众号:『 程序员小航 』 2020.07.30 加入

某不知名互联网公司 Java 程序员一枚。记录工作学习中的技术、开发及源码笔记;分享生活中的见闻感悟。

评论

发布
暂无评论
ZooKeeper 分布式锁 Curator 源码 02:可重入锁重复加锁和锁释放