我正在尋找一個併發對象,可以幫助在以下用例:併發對象作家通吃優先級超額讀者
- 線程/實體:1個出版商(唯一),O-許多讀取器經常/不正確地更新數據結構,需要以最小的延遲快速地更新數據結構
- 每個讀取器都具有對數據結構的讀取訪問權限(通過不允許寫入的東西或者因爲讀取器暗示承諾不改變數據)
- 每個讀者我只要它能夠檢測到發佈者何時來修改它,因爲它知道它最終將獲得足夠的時間來閱讀它所需的數據結構。
有什麼建議嗎?我可以使用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)擁有多個閱讀器似乎排除了一個隊列......我想我可以有一個主代理閱讀器並讓它通知每個真實的閱讀器。
看到我的評論我補充說。 – 2009-08-06 14:05:52
我會讓一個消費者獲取數據,合併它,然後將其傳遞給多個下游消費者(可能通過其他隊列?) – 2009-08-06 14:07:09