【发布时间】:2011-05-29 03:02:22
【问题描述】:
我正在寻找一种高效的系统,该系统具有一系列分层组织的读/写锁,以管理对分层组织资源的访问。如果一个子树被锁写,那么在整个子树被释放之前,应该无法获得其他锁;同样,子树中的写锁应该防止锁定父树。
以下是我正在考虑的想法:
-
使用Apache Commons Transaction。不幸的是,该项目自 2008 年 3 月以来一直没有更新,并已被非正式终止。一些 API 文档似乎表明即将发布的版本(1.3 或 2.0)将包含 some kind of hierarchical locking,但找不到源代码,而且我们似乎无法再访问他们的 SVN 存储库了。
李> 使用一系列
ReentrantReadWriteLocks,我会按层次组织。我不是并发专家,我有点害怕自己做。初步的想法似乎表明,即使在我可以尝试锁定子树之前,我也必须在管理ReentrantReadWriteLocks 本身的整个结构上使用外锁 - 这样即使 释放锁 我得用外锁……-
使用
java.util.concurrent和java.util.concurrent.atomic中的类以比使用一系列ReentrantReadWriteLocks 更有效的方式实现我的分层锁。
我已经准备好走最后一条路了,但我很惊讶没有找到任何可以更好地解决这个问题的现有库。所以:
- 我是否遗漏了一些明显的解决方案?
- 还是这个问题特别难以正确解决?
【问题讨论】:
-
远离
atomic,正确理解和实施是非常微妙的。 -
您的第二个解决方案似乎是正确的。当您想要锁定一个节点时,您需要获取全局锁,以便您可以检查该节点的所有子节点都没有被锁定,并且它的父节点也没有被锁定。
-
对了,Commons Transaction 是available,不过不知道对你有没有用。
-
@toto 感谢您对我的方法发表评论。是的,1.2 版可用,但不包括分层锁的东西。
标签: java locking hierarchical reentrancy readwritelock