2013-12-20 35 views
1

我試圖根據this發佈來擴展Java中的無鎖隊列的實現。Java中的無鎖定和大小限制隊列

對於我的實現,我僅限於使用原子變量/引用。 另外,我的隊列應該有一個最大尺寸。 因此,putObject()應該在隊列滿時阻塞,如果隊列爲空,則應該阻塞getObject()。

目前我不知道如何解決這個問題,而不使用鎖。

例如,當使用AtomicInteger時,修改操作將是原子操作。 但是仍然存在一個問題,我必須處理putObject()和getObject()中的檢查和修改情況嗎? 因此,在檢查當前隊列大小之後,排隊線程會中斷的情況仍然存在。

我現在的問題是,如果這個問題可以解決我目前的限制嗎?

電賀

回答

0

這是通常使用的環形緩衝區解決了一個非常普遍的問題。這是網絡適配器使用的庫,如Disruptor庫。我建議你看看Disruptor,以及你可以用環形緩衝區做什麼的一個很好的例子。

+0

當隊列滿(空)時會發生Disruptor塊嗎? –

+1

@Alexei AFAIK,它採用了阻擋,旋轉,停車,屈服等多種「等待策略」,直到滿足條件。 – CaptainHastings

0

如果您有一個可行,正確工作的無鎖隊列,添加最大大小可以像添加AtomicInteger一樣簡單,並在正確的時間執行檢查,inc,dec。

添加元素時,基本上預先保留了隊列中的位置。 喜歡的東西:

while (true) { 
    int curr = count.get(); 
    if (curr < MAX) { 
     if (count.compareAndSet(curr, curr + 1)) { 
      break; 
     } 
    } 
    else { 
     return FULL; 
    } 
} 

然後添加新的元素和鏈接它 得到時,您可以只訪問頭像往常一樣,並檢查是否有任何東西從隊列中返回。如果是的話,你將它歸還,然後減少計數器。如果不是,則只需返回「空」。請注意,我沒有使用計數器來檢查隊列是否真的是空的,因爲計數器可能是1,而由於預先儲備方法,沒有任何東西鏈接到隊列中。所以我只是相信你的隊列有一種方法可以告訴你「我有我的東西」或不(它必須,或者get()永遠不會工作)。