2012-02-27 11 views
5

Mam tu na myśli: Jeśli masz 2 wątki wykonujące operacje FAST, które muszą być zsynchronizowane, czy nie jest to podejście nieblokujące szybsze/lepsze niż podejście blokujące/przełączające kontekst?Blokowanie blokad a Blokowanie niezablokowujące

przez non-blocking mam na myśli coś takiego:

while (true) { if (checkAndGetTheLock()) break; }

Jedyne co mogę myśleć to głód (z wypaleniem procesora), jeśli zbyt wiele wątków zapętla się wokół blokady.

Jak wyważać jedno podejście w stosunku do drugiego?

+0

Ile operacji blokowania wykonasz na rdzeń procesora na sekundę? – usr

+0

AFAIK, JVM wykonuje tę optymalizację dla ciebie, jeśli nie ma rywalizacji na zamku (co powinno mieć miejsce, jeśli operacja jest szybka) –

+0

@JB Nizet: Myślę, że musisz podjąć tę decyzję samodzielnie, używając synchronizowanego kontra ReentrantLock. – chrisapotek

Odpowiedz

5

Oto co Java współbieżności w Praktyce mówi na ten temat:

JVM można realizować blokowanie albo poprzez spin-oczekiwania (wielokrotnie próbuje zdobyć zamek aż do skutku) lub bysuspending zablokowany przeprowadź przez system operacyjny. Który jest bardziej wydajny zależy od związku między narzutem przełączania kontekstu a czasem , aż blokada stanie się dostępna; oczekiwanie na wirowanie jest lepsze w przypadku krótkiego oczekiwania, a zawieszenie jest preferowane w przypadku długiego oczekiwania. Niektóre maszyny wirtualne JVM wybierają między nimi dwie adaptacyjne w oparciu o dane profilowania z przeszłego oczekiwania razy, ale większość po prostu wstrzymuje wątki oczekujące na blokadę.

a także (co jest, IMO, najważniejszy punkt):

nie martw się zbytnio o kosztach uncontended synchronizacji. Podstawowy mechanizm jest już dość szybki, a maszyny JVM mogą wykonywać dodatkowe optymalizacje, które jeszcze bardziej zmniejszają lub eliminują koszty. Zamiast tego, należy skoncentrować działania optymalizacyjne na obszarach, w których faktycznie występuje twierdzenie o zablokowaniu .

+0

Nie ufałbym, że "Niektóre maszyny JVM wybierają między sobą dwie metody adaptacyjne w oparciu o dane profilowania z poprzednich czasów oczekiwania, ale większość z nich po prostu wstrzymuje wątki oczekujące na blokadę." Ale nigdy nie wiesz, do czego zdolne są te nowoczesne wirtualne maszyny JVM. Myślę, że synchronizacja blokuje się i ReentrantLock jest zajęty - czeka. Ale jeśli potrafią się nawzajem zmieniać w czasie wykonywania, nie jestem pewien. – chrisapotek

+1

Gdzie przeczytałeś, że ReentrantLock jest zajęty - czeka? Gdyby tak było, doprowadziłoby to JVM do kolan przez długie oczekiwanie. Jawadok mówi: * Wzajemne wykluczenie wzajemne Blokada z tym samym podstawowym zachowaniem i semantyką, co niejawna blokada monitora, do której można uzyskać dostęp za pomocą zsynchronizowanych metod i instrukcji, ale z rozszerzonymi możliwościami. * –

+0

Mogę się mylić, ale przeglądając kod źródłowy, myślałem, że było jego podejście: http://fuseyism.com/classpath/doc/java/util/concurrent/locks/AbstractQueuedSynchronizer-source.html NOOOOO! JVM NIE używa ReentrantLock do swoich wewnętrznych rzeczy. – chrisapotek

1

Cóż, jedynym sposobem, aby się upewnić, jest sprawdzenie go. Jeśli chodzi o wielowątkowość i wydajność, po prostu nie można założyć.

+0

Ta odpowiedź jest poprawna i nie należy jej cofać. – usr

+0

@ cóż, dlaczego nie zrobiłeś tego? Gorąco kusiło mnie, żebym to zrobił dwa razy, ale na M Platvoet byłoby to niesprawiedliwe. –

+0

Podniosłem go. Istnieje odwołanie w dół. – usr