2013-02-15 26 views
5

Dostaję się do Semaforów w Javie i czytałem ten artykuł http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/Semaphore.html. Jedyne, czego nie otrzymuję, to dlaczego metoda acquire() nie jest używana w zsynchronizowanym kontekście. Patrząc na przykład z powyższego webiste:Dlaczego metoda nabywania() w semaforach nie musi być zsynchronizowana?

Tworzą semafora:

private Semaphore semaphore = new Semaphore(100); 

i uzyskać pozwolenie tylko tak:

semaphore.acquire(); 

Teraz nie byłoby to możliwe, że dwa lub więcej wątków próbuje zdobyć() w tym samym czasie? Jeśli tak, nie byłoby problemu z liczeniem.

Czy sam semafor obsługuje synchronizację?

Odpowiedz

3

Czy sam semafor obsługuje synchronizację?

Tak, to w zasadzie to. Semafory są bezpieczne dla wątków, jak wyjaśniono w the javadoc:

pamięci efekty Konsystencja: Działania w wątku przed wywołaniem „uwolnienie” metody takie jak uwolnienie() zdarzyć, zanim działania po udanej „zdobyć” metody takie jak nabywać() w innym wątku.

Większość operacji na obiektach w pakiecie java.util.concurrent są bezpieczne dla wątków. Więcej szczegółów znajduje się na samym dole package javadoc.

3

Semafory powinny być szybkie i dlatego używać prymitywów współbieżności atomowej z klasy Unsafe, np. CAS (compare and swap).

Dzięki tym prymitywom synchronizacja odbywa się na znacznie niższym poziomie, a monitory nie są potrzebne. (Synchronizacja bez blokady).

W rzeczywistości synchronizacja jest wykonywana przez pętlę w sposób ciągły przy użyciu CAS, dopóki oczekiwana wartość nie będzie równa wartości zapisanej/odczytanej.

0

synchronizacja jest gwarantowana przez AbstractQueuedSynchronizer z operacji CAS

zobaczyć javadoc tutaj

Powiązane problemy