2010-10-15 14 views
11

Nie mogłem całkiem zrozumieć następujących z opisu semafora w javadocs.Semafor i synchronizacja

Należy pamiętać, że blokada nie jest synchronizacja odbyło kiedy nabyć() jest wywoływana za tym uniemożliwiłyby element z bycia zwrócone do puli. Semafor hermetyzuje synchronizację potrzebną do ograniczenia dostępu do puli, , niezależnie od potrzebnej synchronizacji, aby zachować konsystencję samej puli.

Czy ktoś może mi pomóc zrozumieć to i jego implikacje.

Odpowiedz

11

Semafor działa jako ogranicznik dostępnej głębokości puli zasobów; na przykład, semafor o pojemności 10 pozwala na pobranie maksymalnie 10 wątków naraz, a kolejne wątki, które próbują go uzyskać, będą blokować, dopóki jeden z pozostałych wątków go nie zwolni.

To trochę różni się od zwykłego wzajemnego wykluczania lub blokowania monitora, które jest zwykle używane, aby zapobiec jednoczesnemu modyfikowaniu tych samych zmiennych przez więcej niż jeden wątek i spowodowaniu niespójnych wyników lub stanu programu.

Weźmy na przykład pulę połączeń z limitem 10 połączeń. Każdy wątek wymagający połączenia pobierze semafor na czas jego używania połączenia (co zapobiega zbyt wielu wątkom z prośbą o połączenie jednocześnie), ale obiekt puli musi również używać zsynchronizowanych bloków lub metod podczas wykonywania połączeń poza jego wewnętrzną siecią. zbierania lub umieszczania ich z powrotem, aby zapobiec takim rzeczom jak utrata śledzenia połączeń lub błędne przekazanie tego samego połączenia dwóm różnym wątkom, ponieważ prosiły one jednocześnie.

+3

Rzeczywiście dobre wyjaśnienie. +1 –