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.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ