JAVA · 비동기/동시성
ReadWriteLock
읽기-쓰기 잠금으로 읽기 동시성을 높이는 전략입니다.
비동기/동시성고급ReadWriteLock읽기쓰기잠금캐시동시성
핵심 설명
읽기-쓰기 잠금으로 읽기 동시성을 높이는 전략입니다.
Java code
import java.util.concurrent.locks.*;
import java.util.*;
public class ReadWriteLockDemo {
private final ReadWriteLock rwLock = new ReentrantReadWriteLock();
private final Lock readLock = rwLock.readLock();
private final Lock writeLock = rwLock.writeLock();
private final Map<String, String> cache = new HashMap<>();
// 읽기 — 동시 접근 허용
String get(String key) {
readLock.lock();
try {
return cache.get(key);
} finally {
readLock.unlock();
}
}
// 쓰기 — 배타적 접근
void put(String key, String value) {
writeLock.lock();
try {
cache.put(key, value);
} finally {
writeLock.unlock();
}
}
// 읽기 -> 쓰기 업그레이드 (직접 불가, 재획득 필요)
String computeIfAbsent(String key, java.util.function.Function<String, String> fn) {
readLock.lock();
try {
String value = cache.get(key);
if (value != null) return value;
} finally {
readLock.unlock();
}
// 읽기 잠금 해제 후 쓰기 잠금 획득
writeLock.lock();
try {
// 다시 확인 (다른 스레드가 먼저 넣었을 수 있음)
return cache.computeIfAbsent(key, fn);
} finally {
writeLock.unlock();
}
}
public static void main(String[] args) {
var demo = new ReadWriteLockDemo();
demo.put("key1", "value1");
System.out.println(demo.get("key1"));
System.out.println(demo.computeIfAbsent("key2", k -> "computed-" + k));
}
}학습 팁
읽기가 쓰기보다 훨씬 빈번한 캐시 시나리오에서 ReadWriteLock이 효과적입니다. Java 8+에서는 StampedLock도 고려하세요.
주의할 점
ReadWriteLock에서 읽기 잠금을 쓰기 잠금으로 직접 업그레이드할 수 없습니다. 읽기를 먼저 해제하고 쓰기를 획득해야 합니다.
자주 묻는 질문
ReadWriteLock란 무엇인가요?
읽기-쓰기 잠금으로 읽기 동시성을 높이는 전략입니다.
ReadWriteLock 학습 시 주의할 점은 무엇인가요?
ReadWriteLock 에서 읽기 잠금을 쓰기 잠금으로 직접 업그레이드할 수 없습니다. 읽기를 먼저 해제하고 쓰기를 획득해야 합니다.
Continue Learning
Java 학습을 이어가세요
총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.