2013-07-24 13 views
13

Próbuję zrozumieć przydatność własności fairness w klasie Semaphore.Ustawienie rzetelności w klasie semaforów

Konkretnie zacytować Javadoc wspomina, że:

Generalnie semafory używane do kontrolowania dostępu do zasobów powinien być inicjowany jako sprawiedliwe, aby upewnić się, że żaden wątek jest zagłodzony na dostęp do zasobu. Podczas korzystania z semaforów do innych rodzajów kontroli synchronizacji, zalety przepustowości nie-uczciwego uporządkowania często przeważają nad względami uczciwości.

Czy ktoś może podać przykład, w którym może być pożądany barek. Nie mogę myśleć o przeszłości za pomocą użycia zasobów. Dlaczego domyślnie jest to zachowanie nie fair?

Czy są jakieś konsekwencje wydajnościowe w stosowaniu zachowania uczciwości?

Odpowiedz

21

wbudowane w konstrukcje współbieżności Java (synchronized, wait(), notify() ...) nie określają, który wątek powinien być uwolniony, gdy blokada zostanie zwolniona. Od decyzji JVM zależy, który algorytm zastosować.

Uczciwość daje większą kontrolę: po zwolnieniu blokady wątek o najdłuższym czasie oczekiwania otrzymuje blokadę (przetwarzanie FIFO). Bez uczciwości (iz bardzo złym algorytmem) możesz mieć sytuację, w której wątek zawsze czeka na blokadę, ponieważ istnieje ciągły strumień innych wątków.

Jeśli Semafor jest ustawiony na uczciwy, istnieje mały narzut, ponieważ musi on utrzymywać kolejkę wszystkich wątków oczekujących na blokadę. Jeśli nie piszesz aplikacji o wysokiej przepustowości/wysokiej wydajności/wielu rdzeni, prawdopodobnie nie zobaczysz różnicy!

Scenariusz gdzie uczciwość nie jest potrzebna

Jeśli masz N wątków identyczne pracownik, to nie ma znaczenia, który dostaje zadanie do wykonania

scenariusz, w którym potrzebne jest uczciwość

Jeśli masz N kolejki zadań, nie chcesz, aby jedna kolejka czekała na zawsze i nigdy nie uzyskała blokady.