|
|
1
3
这是一些源代码。它基本上与CB160所说的相同,但是拥有源代码可能有助于清除您可能仍然存在的任何问题。尤其是FunkyCollection上的方法必须同步。 正如Meriton指出的,get方法在每次添加新对象时对每个阻塞的get执行O(N)扫描。它还执行O(N)操作来删除对象。这可以通过使用类似于链表的数据结构来改进,在链表中可以检查最后一个项目的迭代器。我没有为这个优化提供源代码,但是如果您需要额外的性能,实现它应该不会太困难。
输出:
请注意,我将所有内容都放在一个源文件中,以便于运行。 |
|
|
2
3
我知道没有任何现有的容器可以提供这种行为。您面临的一个问题是,没有现有条目与查询匹配。在这种情况下,您必须等待新条目到达,而这些新条目应该到达序列的尾部。考虑到您正在阻塞,您不需要检查最新添加之前的所有条目,因为您已经检查了它们并确定它们不匹配。因此,您需要某种方法来记录您当前的位置,并且能够在新条目到达时从那里向前搜索。
这个等待是一个工作
每次呼叫
您没有提到如何或是否从该容器中移除项目。如果容器只增长,这就简化了线程扫描其内容的方式,而不必担心来自其他线程的争用会改变容器。每个线程都可以自信地开始查询 最低限度 可供检查的条目数。但是,如果您允许删除项目,那么还需要面对更多的挑战。 |
|
|
3
2
在FunkyCollection Add方法中,可以在每次添加元素时对集合本身调用NotifyAll。 在get方法中,如果底层容器(任何合适的conatiner都可以)不包含所需的值,请等待funkycollection。通知等待后,检查基础容器是否包含所需的结果。如果是,则返回该值,否则,请再次等待。 |
|
|
4
1
似乎您正在寻找元组空间的实现。这个 Wikipedia article about them 列出Java的几种实现方式,也许您可以使用其中之一。否则,您可能会发现一个要模仿的开源实现,或者相关的研究论文。 |
|
|
ron burgundy · 获取-释放语义是否跨线程传递?[副本] 1 年前 |
|
|
H3007 · 并发运行python子进程似乎不是并发的 2 年前 |
|
|
The Oddler · TVar会阻止读取直到更改吗? 2 年前 |
|
|
Wang Tuma · 使用信号量的c++并发问题:按顺序打印 2 年前 |
|
|
Marcel Batista · 在不同线程中更新密钥时的字典线程安全 2 年前 |
|
|
rico · 当volatile关键字真的是必要的? 2 年前 |