互联网技术 / 互联网资讯 · 2024年1月18日

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

前言

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

1锁重入

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

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

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

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

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

2锁释放

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

主要分为两部分:

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

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

3总结

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

OpenMagic API

Need more than content? Move into the product flow.

If you are here for model access, pricing, developer docs, or the future API console, the dedicated product path now lives on api.openmagic.ai.

登录免费注册