2013-07-24 58 views
13

我想了解Semaphore類中公平屬性的用處。信號量級中的公平設置

具體引述的Javadoc提到:

一般來說,用於控制資源訪問的信號量應該被初始化爲公平的,以確保沒有線程訪問一個資源匱乏的。當使用信號量進行其他類型的同步控制時,非公平排序的吞吐量優勢往往超過公平性考慮。

有人可以提供一個例子,其中可能需要在這裏進行駁船。我無法想象過去的資源訪問用例。此外,爲什麼默認是不公平的行爲?

最後,在使用公平行爲時是否會有任何性能影響?

回答

21

Java的內置併發結構(​​,wait(),notify(),...)不指定釋放鎖時哪個線程應該被釋放。由JVM實現來決定使用哪種算法。

公平性給你更多的控制權:當鎖被釋放時,具有最長等待時間的線程被給予鎖(FIFO處理)。如果沒有公平性(並且算法非常糟糕),您可能會遇到線程始終等待鎖定的情況,因爲存在連續的其他線程流。

如果信號量被設置爲公平的,則會有小的開銷,因爲它需要維護等待鎖的所有線程的隊列。除非您正在編寫高吞吐量/高性能/多核應用程序,否則您不會看到差異!

場景,不需要

公平如果你有N個相同的工作線程,它並不重要的人得到的任務中執行

場景,需要公平

如果您有N個任務隊列,您不希望一個隊列永遠等待並且永遠不會獲取鎖定。