我正在尝试设计一种非常类似于 java 并发读写锁的东西,但要控制可能相互重叠的资源之间的访问。这个想法是
Operation mgr.startReadOperation(Scope scope) // acquires a read lock
Operation mgr.startEndOperation(Scope scope) // acquires a writelock
operation.end() // release the lock
如果另一个操作已在任何范围 otherScope 上获得锁定,则 startOperation 应阻止
scope.overlaps(otherScope) == true
...具有并发读取可以但写入锁是独占的通常行为。
我可以设想如何在我手动维护的一组操作上使用单个排他锁来执行此操作:如果正在进行任何重叠操作,请求者会在单个条件上等待,并且 operation.end() 会通知所有服务员。
但是我想知道是否有更智能的设计,特别是可以利用 Java 7 ReadWriteLock 实现的“公平”属性的设计?
[编辑] 我应该提到可能的范围列表非常大且动态。为了帮助描绘事物,范围是资源树层次结构中的任意节点集合,其中资源一直被创建和删除。只要它们的两个节点相同或共享一个共同的祖先,两个范围就会重叠。