2013-02-26 53 views
1

我看着ArrayBlockingQueueJava的公平隊列

對於fair選項,我可以在構造函數中傳遞,這是什麼意思實際上是公平的?

公平 - 如果爲true,則隊列對插入時被阻塞的線程的訪問或刪除時的線程,按先進先出順序處理;如果爲false,則未指定訪問訂單爲 。

從我理解的公平意味着FIFO?不是我所需要的?例如。 1線程不應該繼續訪問隊列?

+0

這意味着什麼是在javadoc中描述的。你不明白什麼?你準確的問題是什麼? – 2013-02-26 09:34:00

+0

@JBNizet,我期待公平的意思是1個線程不應該能夠一直訪問隊列(如果有其他線程在等待)。是不是一個正常的隊列按先進先出順序出隊? – 2013-02-26 09:48:16

+1

這就是你用公平的旗幟所能產生的效果。如果線程A從隊列中獲取一個元素,那麼線程B添加一個,然後線程C獲得一個線程,線程A將首先被服務,然後是B,然後是C.它與隊列中的哪個*元素沒有任何關係他們會得到。這取決於隊列的類型(優先級,數組等)和所調用的方法。您混淆了隊列中元素的順序以及線程可以調用隊列中方法的順序。 – 2013-02-26 09:55:14

回答

2

FAIR將實施公平調度策略,以允許 實現選擇一個。公平調度聽起來更好,因爲它避免了不幸的線程 可能無限期地延遲的可能性,但是實際上,它提供的好處很少重要,足以證明其產生的大的 開銷,它強加在隊列的操作。如果未指定公平調度 ,則ArrayBlockingQueue通常會近似公平地運行 ,但無法保證。

Reference with Code

0

公平就是保證FIFO訪問。 Java 7將爲任何嘗試訪問隊列的線程創建一個隊列,當它已經被鎖定時。

由於線程排序隊列的維護,因此公平隊列將比使用陣列阻塞隊列的系統中的不公平隊列慢得多。如果所有線程都以非常相似的速度進展並不是非常重要,那麼保持排隊不公平是值得的。

+0

但是不應該是一個正常的隊列也是FIFO?還是我誤解了一些東西? – 2013-02-26 09:52:23

+1

通常,不會創建隊列來訪問陣列阻塞隊列。相反,嘗試訪問它的線程會在不同的時間間隔內繼續嘗試這樣做。無論發生哪種情況,都會在獲取它之後嘗試最先獲取arrayblockingqueue的鎖,而不是等待最長的線程。 – user2079377 2013-03-02 10:08:10

+0

我認爲最後的評論應該是被接受的答案 - 這是最清楚的解釋。 – 2017-01-18 22:42:48

0

根據您的問題,您可以定義什麼是公平的。你可以說公平是一個線程可以訪問資源的時隙。或者,您可以將fair定義爲以先入先出的方式訪問資源的線程。

FIFO在訪問資源的順序上是公平的。