【发布时间】:2010-01-09 22:51:54
【问题描述】:
我想将元组对象存储在并发 Java 集合中,然后有一个高效的阻塞查询方法,它返回与模式匹配的第一个元素。如果没有这样的元素可用,它将阻塞,直到出现这样的元素。
例如,如果我有课:
public class Pair {
public final String first;
public final String Second;
public Pair( String first, String second ) {
this.first = first;
this.second = second;
}
}
还有一个像这样的集合:
public class FunkyCollection {
public void add( Pair p ) { /* ... */ }
public Pair get( Pair p ) { /* ... */ }
}
我想这样查询:
myFunkyCollection.get( new Pair( null, "foo" ) );
它返回第一个可用的对,其中second 字段等于“foo”或阻塞,直到添加这样的元素。另一个查询示例:
myFunkyCollection.get( new Pair( null, null ) );
应该返回第一个可用的对,无论其值如何。
解决方案是否已经存在?如果不是这样,您建议如何实现get( Pair p ) 方法?
澄清:方法get( Pair p)也必须删除元素。名字的选择不是很聪明。更好的名字是take( ... )。
【问题讨论】:
-
“第一个”元组 - 根据哪个顺序?
-
插入订单。应该返回插入的第一个匹配项。
-
@paradigmatic:您已经接受了答案,但我认为仍有改进的空间。您能否大致了解您正在处理的数据的大小?对于非常大的数据,我给出的解决方案,即使有链表优化,仍然可能太慢。您可以从 DB 世界中汲取灵感,将数据两次存储在 B 树中,一次按(第一个,插入 id)排序,再次按(第二个,插入 id)排序。这意味着 add 和 get 都可以是 O(log(n))。这对你来说听起来很有趣吗?您想了解更多详情吗?
-
您的回答让我更进一步。我正在编写一个小型 SPMD 库以用于其他项目(很快就会公开)。数据通常不应该像 O(p) 这样重要,其中 p 是集群中的机器数量,因此我将在实际基准测试之后选择合适的数据结构。再次感谢。
标签: java collections blocking concurrency