PHpullh

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 에서 읽기 잠금을 쓰기 잠금으로 직접 업그레이드할 수 없습니다. 읽기를 먼저 해제하고 쓰기를 획득해야 합니다.