前言
加锁逻辑已经介绍完毕,那当一个线程重复加锁是如何处理的呢?
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 来判断是否重入的。
Ubuntu是一个以桌面应用为主的Linux操作系统。它是一个开放源代码的自由软件,提供了一个健壮、功能丰富的计算环境,既适合家庭使用又适用于商业环境。Ubuntu将为全球数百个公司提供商业支持。 ...
查看全文Docker采取了一种保守的方法来清理未使用的对象(通常称为“垃圾收集”),例如图像,容器,卷和网络:除非您明确要求Docker这样做,否则通常不会删除这些对象。这可能会导致Docker使用额外的磁盘空...
查看全文新浪科技讯 北京时间5月27日晚间消息,据报道,四位知情人士今日透露,亚马逊、微软和谷歌这三大云计算服务提供商,正在竞争波音公司(Boeing)价值10亿美元的云服务合同。 这些...
查看全文新浪科技讯 北京时间5月27日晚间消息,据报道,多位知情人士今日称,继加州、纽约州和华盛顿州之后,马萨诸塞州和宾夕法尼亚州的总检察长也加入到对亚马逊的反垄断调查中。 如今,越来越...
查看全文
您好!请登录