1. ReentrantLock

Condition – застосування умов блокування дозволяє добитися контролю над керуванням доступу до потоків. Умова блокування є об'єктом інтерфейсу Condition з пакету java.util.concurrent.locks. Застосування об'єктів Condition багато в чому аналогічне використанню методів wait/notify/notifyAll класу Object, які ми розглянули в одній з минулих тем.

Lock – інтерфейс із lock framework, що надає гнучкий підхід до обмеження доступу до ресурсів/блоків у порівнянні з synchronized. За умови використання кількох локів порядок їхнього звільнення може бути довільним, плюс його також можна налаштувати. Ще є можливість обробити ситуацію, коли лок вже захоплено.

ReentrantLock – одна з реалізацій інтерфейсу Lock – клас ReentrantLock. Він дозволяє одному й тому потоку викликати метод lock, навіть якщо він його викликав раніше, без звільнення блокування.

У класу ReentrantLock, крім методів інтерфейсу Lock, є фабричний метод newCondition(). Цей метод повертає об'єкт Condition, який дозволяє додати нинішній потік до wait set цього об'єкта Condition.


private final Lock R_LOCK = ReentrantLock();
R_LOCK.lock();
try {
   //тут відбуваються якісь дії
} finally {
   R_LOCK.unlock();
}

ReadWriteLock – інтерфейс для створення read/write локів. Локи надзвичайно корисні, коли в системі багато операцій читання та мало операцій запису.

ReentrantReadWriteLock – використовується в багатопотокових сервісах і кешах, що мають гарний приріст продуктивності в порівнянні з блоками synchronized. По суті, клас працює в двох взаємовиключних режимах: коли багато читачів читають дані до паралелв і коли лише один райтер пише дані.

ReentrantReadWriteLock.ReadLock – read lock для reader-ів, що отримується через readWriteLock.readLock().

ReentrantReadWriteLock.WriteLock – write lock для writer-ів, що отримується через readWriteLock.writeLock().

2. Synchronizer

AbstractOwnableSynchronizer – базовий клас, який відповідає за побудову механізмів синхронізації. Містить гетер/сетер для запам'ятовування та читання ексклюзивного потоку, який може працювати з твоїми даними.

AbstractQueuedSynchronizer – базовий клас для механізму синхронізації у FutureTask, CountDownLatch, Semaphore, ReentrantLock, ReentrantReadWriteLock. Також він застосовується у створенні нових механізмів синхронізації, що покладаються на одиночне та атомарне значення int.

AbstractQueuedLongSynchronizer – різновид AbstractQueuedSynchronizer, що підтримує атомарне значення long.