2013-02-18 52 views
0

我正在尋找一個線程安全無限阻塞fifo,它由固定緩衝區(如數組)支持。語義是多讀者和寫者線程可以安全地訪問它。如果緩衝區已滿並覆蓋最舊的項目,寫入程序會阻止。如果緩衝區爲空,則讀取器阻止。當總計添加和總計刪除的計數器一次或多次纏繞內部緩衝區大小時,必須保持Fifo順序。java中的無限fifo

有趣的是,我會尋找這個東西(java自己的併發集合,公共集合,番石榴)通常看不到有這樣一個'明顯'需求的即時答案。

+3

你的意思是無限的? – 2013-02-18 08:28:12

+0

無限我的意思是隨機添加和隨機刪除總添加和刪除遠遠超過支持數據結構的大小無限。 – simbo1905 2013-02-18 16:35:40

+0

umm,ArrayBlockingQueue _does_維持嚴格的fifo順序。你是否嘗試啓用「公平」構造參數? – jtahlborn 2013-02-18 16:54:13

回答

3

你實際上是在描述一個ArrayBlockingQueue

它是線程安全的,並已設計用於確切目的:

  • 作家等待空間變得可用,如果隊列滿了,如果有必要
  • 讀者可以等待到一個指定的等待時間爲一個元素變得可用
+0

感謝您的回答。我嘗試的第一件事是ArrayBlockingQueue。當隨機添加和隨機刪除以及溢出和批量插入和批量清除時,單元測試開始失敗。我希望fifo訂購保證,而不必在外部跟蹤訂單或儘可能進行排序。 – simbo1905 2013-02-18 16:37:55

+0

我的意思是隨機讀取/寫入邏輯頭部和邏輯尾部不是隨機的邏輯FIFO中。如果我總是希望緩衝區充分有效,那麼循環緩衝區語義看起來像是超出原始ABQ的東西。 – simbo1905 2013-02-18 16:54:23

+0

@ simbo1905 - ABQ _is_是一個循環緩衝區。目前尚不清楚ABQ缺乏哪些功能? – jtahlborn 2013-02-18 16:56:08

0

這聽起來像你正在尋找ArrayBlockingQueue

+0

我已編輯的問題,使其更清晰,我正在尋找一些東西,可能是作家覆蓋最舊的項目的阻塞循環緩衝區。 – simbo1905 2013-02-18 17:08:50

0

,如果你正在尋找無限阻塞隊列或界阻塞隊列它是什麼並不清楚。

  1. 界阻塞隊列:java.util.concurrent.ArrayBlockingQueue中
  2. 無限阻塞隊列(僅由RAM約束的限制):java.util.concurrent.LinkedBlockingQueue中

對於所有我會建議使用ArrayBlockingQueue的情況。

+0

感謝您的回答。在其他答案中提示ABQ我表明我更多地尋找一個循環緩衝區,這對ABQ來說不是開箱即用的。 – simbo1905 2013-02-18 16:52:32

+0

哼。我被困在有一個數組,因爲我不一定想要添加和刪除鏈接的垃圾回收。但這可能是可以接受的,並且鏈接阻塞隊列可能會訣竅。會給它一個去讓你知道。 – simbo1905 2013-02-18 17:12:16

0

對於無限隊列你就必須創建自己的類使用隊列代表(也許ArrayBlockingQueue),當隊列滿運行,適應規模實現BlockingQueue接口,創建一個新的,更大的委託。這應該是無限的,最大爲MAX_INT,並避免鏈接隊列(需要爲每個插入的對象創建節點)涉及的GC開銷。如果需要,您也可以縮小委託。

+0

如何保持與很多隨機添加和刪除fifo訂購? – simbo1905 2013-02-18 16:39:26

+0

不確定你在這裏是什麼意思。在FIFO(a.k.a列表或隊列)中,中間不應有隨機寫入。 – 2013-02-18 16:45:30

+0

道歉我並不是指隨機訪問,我的意思是從頭部或尾部隨機讀取。如果您嘗試使用ArrayBlockingQueue創建一個循環緩衝區,使其保持滿,但頭部和尾部不在位置0或位置(大小爲1)處,請確保始終從邏輯尾部和下一個位置讀取下一個從邏輯頭讀取並不容易,因爲在模擬線性結構而不是無限循環緩衝區的結構中調用內置頭/方法。 – simbo1905 2013-02-18 16:49:33