Czym jest mutex i Semafor w Javie? Jaka jest główna różnica?

Czym jest mutex i Semafor w Javie ? Jaka jest główna różnica ?

Author: Jan Hrcek, 2009-04-21

11 answers

Semafor może być policzony, natomiast mutex może liczyć tylko do 1.

Załóżmy, że masz uruchomiony wątek, który akceptuje połączenia klientów. Ten wątek może obsługiwać 10 klientów jednocześnie. Następnie każdy nowy klient ustawia SEMAFOR aż osiągnie 10. Jeśli Semafor ma 10 znaczników, wtedy wątek nie będzie akceptował nowych połączeń

Mutex są zwykle używane do ochrony rzeczy. Załóżmy, że 10 klientów ma dostęp do wielu części systemu. Następnie można chronić część systemu z mutex więc gdy 1 klient jest podłączony do tego podsystemu, nikt inny nie powinien mieć dostępu. Do tego celu można również użyć semafora. Mutex jest "semaforem wzajemnego wykluczenia" .

 110
Author: Eric,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-21 06:58:24

Niestety wszyscy pominęli najważniejszą różnicę między semaforem a muteksem; pojęcie " własności ".

Semafory nie mają pojęcia własności, co oznacza, że każdy wątek może wydać SEMAFOR (może to prowadzić do wielu problemów, ale może pomóc w "wykryciu śmierci"). Podczas gdy mutex ma pojęcie własności (tzn. możesz zwolnić tylko mutex, który nabyłeś).
Posiadanie jest niezwykle ważne dla bezpiecznego programowania systemy współbieżne. Zawsze zalecałbym używanie mutex zamiast semafora (ale są implikacje wydajności).

Mutexy mogą również wspierać dziedziczenie priorytetów (co może pomóc w problemie inwersji priorytetów) i rekurencję (eliminując jeden rodzaj impasu).

Należy również podkreślić, że istnieją semafory "binarne" oraz semafory "liczące/ogólne". SEMAFOR Javy jest semaforem zliczającym i pozwala na inicjalizację go wartością większe niż jeden (podczas gdy, jak wskazano, mutex może liczyć tylko jeden). Przydatność tego była wskazywana w innych postach.

Podsumowując, jeśli nie masz wielu zasobów do zarządzania, zawsze polecam mutex nad semaforem.

 128
Author: feabhas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-04 21:22:45

Mutex to w zasadzie wzajemne wykluczenie. Tylko jeden wątek może zdobyć zasób na raz. Gdy jeden wątek zdobędzie zasób, żaden inny wątek nie może go zdobyć, dopóki wątek będący właścicielem zasobu nie wyda go. Wszystkie wątki czekające na pozyskanie zasobów zostaną zablokowane.

Semafor służy do kontrolowania liczby wykonywanych wątków. Będzie stały zestaw zasobów. Liczba zasobów będzie zmniejszana za każdym razem, gdy wątek posiada to samo. Kiedy liczba semaforów osiągnie 0, wtedy żaden inny wątek nie może pozyskać zasobu. Wątki są blokowane do czasu wydania innych wątków posiadających zasoby.

W skrócie, główną różnicą jest ile wątków może jednocześnie nabyć zasób ?

  • Mutex-to jeden.
  • Semafor -- its DEFINED_COUNT, (ile semaforów liczy)
 38
Author: aJ.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-21 07:09:20

Mutex jest używany do szeregowego dostępu do zasobu, podczas gdy SEMAFOR ogranicza dostęp do zasobu do określonego numeru. Mutex można traktować jako SEMAFOR z liczbą dostępu równą 1. Niezależnie od tego, na co ustawisz liczbę semaforów, wątki mogą uzyskać dostęp do zasobu, zanim zasób zostanie zablokowany.

 8
Author: Jason Coco,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-21 06:57:53

SEMAFOR jest mechanizmem synchronizacji liczenia, mutex nie.

 3
Author: Brian Rasmussen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-21 06:56:47

Mutex jest często nazywany semaforem binarnym. Podczas gdy SEMAFOR może być utworzony z dowolną liczbą niezerową, mutex jest koncepcyjnie semaforem z liczbą górną równą 1.

 3
Author: Sean,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-21 15:08:16

To pytanie zawiera istotne odpowiedzi i link do oficjalnych wskazówek Javy: Czy w Javie jest Mutex?

 2
Author: Air,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:55:10

Porównujesz nieporównywalne, technicznie nie ma różnicy między semaforem a mutexem to nie ma sensu. mutex to po prostu znacząca Nazwa jak każda nazwa w logice aplikacji, to znaczy, że ty zainicjalizuj SEMAFOR na "1", jest on zwykle używany do ochrony zasobu lub chronionej zmiennej w celu zapewnienia wzajemnego wykluczenia.

 0
Author: Marwen Trabelsi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-07 19:08:37

Mutex jest semaforem binarnym. Musi być zainicjalizowana przez 1, tak aby zasada kto pierwszy ten służy została spełniona. To prowadzi nas do innej specjalnej własności każdego muteksu: ten, który zrobił w dół , musi być tym, który zrobił w górę. Ergo uzyskaliśmy wzajemne wykluczenie w odniesieniu do niektórych zasobów.

Teraz widać, że mutex jest szczególnym przypadkiem semafora ogólnego.

 0
Author: user8,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-28 16:32:52

Obiekt synchronizacji Semafor implementuje klasyczną sygnalizację świetlną. Sygnalizacja świetlna kontroluje dostęp do zasobu współdzielonego przez licznik. Jeśli licznik jest większy niż zero, dostęp jest przyznawany; jeśli jest równy zero, dostęp jest odmawiany. Licznik zlicza uprawnienia, które umożliwiają dostęp do udostępnionego zasobu. Następnie, aby uzyskać dostęp do zasobu, wątek musi otrzymać pozwolenie od światłowodu. Ogólnie rzecz biorąc, aby korzystać ze światełek, wątek, który chce uzyskać dostęp do udostępnionego resource próbuje uzyskać pozwolenie. Jeśli liczba świateł drogowych jest większa niż zero, wątek uzyskuje pozwolenie, a liczba świateł drogowych jest zmniejszana. W przeciwnym razie wątek jest zablokowany, dopóki nie uzyska pozwolenia. Gdy wątek nie potrzebuje już dostępu do udostępnionego zasobu, zwalnia uprawnienia, dzięki czemu liczba sygnalizacji świetlnej jest zwiększona. Jeśli na pozwolenie czeka inny wątek, to w tym czasie nabywa pozwolenie. Klasa semaforów Javy implementuje ten mechanizm.

Semafor ma dwóch budowniczych:

Semaphore(int num)
Semaphore(int num, boolean come)

Num określa początkową liczbę zezwolenia. Następnie num określa liczbę wątków, które mogą uzyskać dostęp do udostępnionego zasobu w danym czasie. Jeśli num jest jednym, może uzyskać dostęp do zasobu po jednym wątku na raz. Ustawiając come jako true, możesz zagwarantować, że wątki, na które czekasz, otrzymają uprawnienia w żądanej kolejności.

 0
Author: Amarildo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-02 21:01:13

Semafor :

SEMAFOR liczący. Koncepcyjnie SEMAFOR posiada zbiór zezwoleń. Każdy acquire() blokuje, jeśli to konieczne, aż do uzyskania pozwolenia, a następnie je zabiera. Każdy release() dodaje Zezwolenie, potencjalnie uwalniając blokujący acquirer. Nie są jednak używane żadne rzeczywiste obiekty zezwolenia; Semafor zachowuje tylko liczbę dostępnych numerów i działa zgodnie z nimi.

semafory są często używane w celu ograniczenia liczby wątków, niż można uzyskać dostęp do niektórych (fizyczne lub logiczne) zasoby

Java nie ma wbudowanego API Mutex. Ale może być zaimplementowany jako SEMAFOR binarny.

SEMAFOR zainicjowany na jeden, który jest używany w taki sposób, że ma co najwyżej jedno dostępne pozwolenie, może służyć jako blokada wzajemnego wykluczenia. Jest to bardziej znane jako SEMAFOR binarny, ponieważ ma tylko dwa stany: jedno dostępne zezwolenie lub zero dostępnych zezwoleń.

W takim przypadku SEMAFOR binarny ma właściwość (w przeciwieństwie do wielu implementacji Lock), że "lock" może być zwolniony przez wątek inny niż właściciel (ponieważ semafory nie mają pojęcia własności) . Może to być przydatne w niektórych specjalistycznych kontekstach, takich jak odzyskiwanie impasu.

Więc kluczowe różnice między semaforem a Mutexem:

  1. Semafor ogranicza liczbę wątków, aby uzyskać dostęp do zasobu przez pozwolenie. Mutex umożliwia dostęp tylko do jednego wątku.

  2. Brak wątków SEMAFOR. Wątki mogą aktualizować liczbę uprawnień przez wywołanie metod acquire() i release(). Muteksy należy odblokować tylko za pomocą gwintu trzymającego zamek.

  3. Gdy mutex jest używany ze zmiennymi warunkowymi, istnieje domniemany bracketing-jest jasne , która część programu jest chroniona d. niekoniecznie jest to w przypadku semafora, który może być nazywany go to programowania współbieżnego-jest potężny, ale zbyt łatwy w użyciu w nieustrukturyzowanym, nieokreślony sposób.

 0
Author: Ravindra babu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-03 13:54:07