Java 动态范围资源的读写锁定

Java 动态范围资源的读写锁定,java,concurrency,Java,Concurrency,我正试图设计一种类似于java并发读写锁的东西,但控制可能相互重叠的资源之间的访问。 这个想法是 Operation mgr.startReadOperation(Scope scope) // acquires a read lock Operation mgr.startEndOperation(Scope scope) // acquires a writelock operation.end() // release the

我正试图设计一种类似于java并发读写锁的东西,但控制可能相互重叠的资源之间的访问。 这个想法是

Operation mgr.startReadOperation(Scope scope) // acquires a read lock
Operation mgr.startEndOperation(Scope scope)  // acquires a writelock
operation.end()                               // release the lock
如果startOperation应阻止iff,则另一个操作已获得任何作用域上的锁,其他作用域

scope.overlaps(otherScope) == true
。。。通常情况下,并发读取是正常的,但写锁是独占的

我可以想象如何通过手动维护的一组操作上的一个独占锁来实现这一点:如果有任何重叠的操作正在进行,请求者将在一个条件下等待,而operation.end()将通知所有等待者

然而,我想知道是否有一种更智能的设计,特别是一些可以利用Java7 ReadWriteLock实现的“公平性”属性的设计


[编辑]我应该提到,可能的作用域列表非常大且动态。为了帮助描述事物,作用域是资源树层次结构中节点的任意集合,其中资源始终被创建和删除。当两个作用域的两个节点相同或共享一个共同的祖先时,两个作用域就会重叠。

为什么不使用
ReadWriteLock
,尤其是
Map
?啊,对不起,您想要一个层次结构。尽管如此,您仍然可以使用
ReentrantReadWriteLock
s的集合作为数据结构的支持。。。但是我是否创建了一个元锁来保护通过内部集合的数据?如果是这样,我似乎没有得到公平性(每个人都会通知一个独占的元锁)?或者start是否会尝试依次(以嵌套方式)获取它所需的每个锁?但是如果在第三个锁之后失败,我需要冒泡等待已获取的两个锁?好吧,您希望以任何一种方式获得绝对公平。而且,在树结构中,为了安全起见,您实际上必须向下挖掘(从最常见的根锁到最专用的锁)。有一件事可能有助于澄清这一点:这是一个抽象概念还是一个具体的场景?在后一种情况下,在你的问题中加入这个场景是值得的。我有一个非常具体的场景,在问题末尾描述的场景。将这些资源视为文件系统的目录和文件:使用根目录tmp和tmp中的文件a、b、c和d,有效范围可以是:[tmp]、[tmp/a、tmp/c]、[tmp/a]、[tmp/a、tmp/d]。。。基本上是节点的任意组合。