【发布时间】:2009-08-07 01:52:52
【问题描述】:
我正在寻找可以帮助以下用例的并发对象:
- 线程/实体:1 个发布者(唯一),0 个读者
- 发布者频繁/不规律地更新数据结构,需要快速更新数据结构,并且延迟时间最短
- 每个读取器都具有对数据结构的读取访问权限(通过某种不允许写入的方式,或者因为读取器隐含承诺不会更改数据)
- 每个读者都愿意反复尝试访问数据结构,只要它能够检测到发布者何时到来并更改它,因为它知道它最终会获得足够的时间来阅读它需要的内容。
有什么建议吗?我可以使用ReentrantReadWriteLock,但有点担心阻止发布者。我宁愿出版商能够破坏读者阅读的机会,也不愿让读者能够阻止出版商。
发布者线程:
PublisherSignal ps = new PublisherSignal();
publishToAllReaders(ps.getReaderSignal());
...
while (inLoop())
{
ps.beginEdit();
data.setSomething(someComputation());
data.setSomethingElse(someOtherComputation());
ps.endEdit();
doOtherStuff();
}
读者话题:
PublisherSignal.Reader rs = acquireSignalFromPublisher();
...
while (inLoop())
{
readDataWhenWeGetAChance();
doOtherStuff();
}
...
public readDataWhenWeGetAChance()
{
while (true)
{
rs.beginRead();
useData(data.getSomething(), data.getSomethingElse());
if (rs.endRead())
{
// we get here if the publisher hasn't done a beginEdit()
// during our read.
break;
}
// darn, we have to try again.
// might as well yield thread if appropriate
rs.waitToRead();
}
}
编辑:在更高的层次上,我想做的是让发布者每秒更改数千次数据,然后让读者以更慢的速度显示最新更新(5 -10 次/秒)。我会使用 ConcurrentLinkedQueue 来发布已发生更新的事实,除了 (a) 同一项目上可能有数百个更新,我想合并这些更新,因为似乎必须重复复制大量数据 就像浪费是一个性能问题,并且(b)有多个读者似乎排除了一个队列......我想我可以有一个主代理读者并让它通知每个真正的读者。
【问题讨论】:
标签: java concurrency