💡 **Когда `ReentrantReadWriteLock` быстрее обычного `synchronized`**
Если приложение часто читает данные и редко их изменяет, один эксклюзивный lock может стать узким местом.
`ReentrantReadWriteLock` разделяет блокировки:
- несколько потоков могут одновременно держать `readLock`;
- `writeLock` получает исключительный доступ;
- во время записи блокируются и читатели, и другие писатели.
```java
private final ReentrantReadWriteLock lock =
new ReentrantReadWriteLock();
private final Lock readLock = lock.readLock();
private final Lock writeLock = lock.writeLock();
public String get(String key) {
readLock.lock();
try {
return cache.get(key);
} finally {
readLock.unlock();
}
}
public void put(String key, String value) {
writeLock.lock();
try {
cache.put(key, value);
} finally {
writeLock.unlock();
}
}
```
Такой подход полезен для кешей, справочников и конфигураций, которые постоянно читаются, но обновляются редко.
Однако `ReentrantReadWriteLock` подходит не всегда. При коротких операциях, высокой конкуренции между писателями или частых обновлениях накладные расходы могут оказаться выше, чем у обычного `synchronized` или `ReentrantLock`.
Используйте его для read-heavy сценариев и обязательно проверяйте результат под реальной нагрузкой.
Если приложение часто читает данные и редко их изменяет, один эксклюзивный lock может стать узким местом.
`ReentrantReadWriteLock` разделяет блокировки:
- несколько потоков могут одновременно держать `readLock`;
- `writeLock` получает исключительный доступ;
- во время записи блокируются и читатели, и другие писатели.
```java
private final ReentrantReadWriteLock lock =
new ReentrantReadWriteLock();
private final Lock readLock = lock.readLock();
private final Lock writeLock = lock.writeLock();
public String get(String key) {
readLock.lock();
try {
return cache.get(key);
} finally {
readLock.unlock();
}
}
public void put(String key, String value) {
writeLock.lock();
try {
cache.put(key, value);
} finally {
writeLock.unlock();
}
}
```
Такой подход полезен для кешей, справочников и конфигураций, которые постоянно читаются, но обновляются редко.
Однако `ReentrantReadWriteLock` подходит не всегда. При коротких операциях, высокой конкуренции между писателями или частых обновлениях накладные расходы могут оказаться выше, чем у обычного `synchronized` или `ReentrantLock`.
Используйте его для read-heavy сценариев и обязательно проверяйте результат под реальной нагрузкой.