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ą.