我想了解Semaphore
類中公平屬性的用處。信號量級中的公平設置
具體引述的Javadoc提到:
一般來說,用於控制資源訪問的信號量應該被初始化爲公平的,以確保沒有線程訪問一個資源匱乏的。當使用信號量進行其他類型的同步控制時,非公平排序的吞吐量優勢往往超過公平性考慮。
有人可以提供一個例子,其中可能需要在這裏進行駁船。我無法想象過去的資源訪問用例。此外,爲什麼默認是不公平的行爲?
最後,在使用公平行爲時是否會有任何性能影響?
我想了解Semaphore
類中公平屬性的用處。信號量級中的公平設置
具體引述的Javadoc提到:
一般來說,用於控制資源訪問的信號量應該被初始化爲公平的,以確保沒有線程訪問一個資源匱乏的。當使用信號量進行其他類型的同步控制時,非公平排序的吞吐量優勢往往超過公平性考慮。
有人可以提供一個例子,其中可能需要在這裏進行駁船。我無法想象過去的資源訪問用例。此外,爲什麼默認是不公平的行爲?
最後,在使用公平行爲時是否會有任何性能影響?
Java的內置併發結構(,wait()
,notify()
,...)不指定釋放鎖時哪個線程應該被釋放。由JVM實現來決定使用哪種算法。
公平性給你更多的控制權:當鎖被釋放時,具有最長等待時間的線程被給予鎖(FIFO處理)。如果沒有公平性(並且算法非常糟糕),您可能會遇到線程始終等待鎖定的情況,因爲存在連續的其他線程流。
如果信號量被設置爲公平的,則會有小的開銷,因爲它需要維護等待鎖的所有線程的隊列。除非您正在編寫高吞吐量/高性能/多核應用程序,否則您不會看到差異!
場景,不需要
公平如果你有N個相同的工作線程,它並不重要的人得到的任務中執行
場景,需要公平
如果您有N個任務隊列,您不希望一個隊列永遠等待並且永遠不會獲取鎖定。