Blokada ponownego wejścia
Warunek - zastosowanie warunków w blokadach pozwala uzyskać kontrolę nad zarządzaniem dostępem do strumieni. Warunek blokady jest obiektem interfejsu Condition zjava.util.concurrent.locks. Korzystanie z obiektów Condition jest pod wieloma względami podobne do korzystania zwait/notify/notifyAllklasy Object , które zostały omówione w jednym z poprzednich tematów.
Lock to interfejs zframeworka lock, który zapewnia elastyczne podejście do ograniczania dostępu do zasobów/bloków w porównaniu do synchronizowanych. W przypadku korzystania z kilku blokad kolejność ich zwalniania może być dowolna, a ponadto można ją skonfigurować. Istnieje również możliwość obsługi sytuacji, gdy zamek jest już przejęty.
ReentrantLock to jedna z implementacji interfejsu Lock , klasa ReentrantLock . Pozwala temu samemu wątkowi wywołać metodę blokady, nawet jeśli wywołał ją wcześniej, bez zwalniania blokady.
Klasa ReentrantLock oprócz metod interfejsu Lock posiada metodę fabryczną newCondition() . Ta metoda zwraca obiektStan, co pozwala na dodanie bieżącego wątku do zestawu oczekiwania danego obiektuStan.
private final Lock R_LOCK = ReentrantLock();
R_LOCK.lock();
try {
//some action happens here
} finally {
R_LOCK.unlock();
}
ReadWriteLock to interfejs do tworzenia blokad odczytu/zapisu. Blokady są niezwykle przydatne, gdy system ma dużo odczytów i mało zapisów.
ReentrantReadWriteLock - używany w usługach wielowątkowych i pamięciach podręcznych, ma niezły wzrost wydajności w porównaniu do synchronizowanych bloków. W rzeczywistości klasa działa w 2 wzajemnie wykluczających się trybach: wiele czytników odczytuje dane równolegle i gdy tylko 1 pisarz zapisuje dane.
ReentrantReadWriteLock.ReadLock - blokada odczytu dla czytników, uzyskiwana poprzez readWriteLock.readLock().
ReentrantReadWriteLock.WriteLock - blokada zapisu dla pisarzy, uzyskana przez readWriteLock.writeLock().
Synchronizator
AbstractOwnableSynchronizer to klasa bazowa odpowiedzialna za budowanie mechanizmów synchronizacji. Zawiera getter/setter do zapamiętywania i odczytywania ekskluzywnego strumienia, który może działać na twoich danych.
AbstractQueuedSynchronizer jest klasą bazową dla mechanizmu synchronizacji w FutureTask, CountDownLatch, Semaphore, ReentrantLock, ReentrantReadWriteLock. Jest również używany podczas tworzenia nowych mechanizmów synchronizacji, które opierają się na pojedynczej i niepodzielnej wartości typu int.
Klasa AbstractQueuedLongSynchronizer jest odmianą klasy AbstractQueuedSynchronizer , która obsługuje długość atomową.
GO TO FULL VERSION