ReenterantReadWriteLock

멀티쓰레드 환경에서 메소드 단위가 아닌 그 안에 임의의 코드블럭 단위로 읽기는 여러 쓰레드가, 쓰기는 하나의 쓰레드 만 가능하게 하고 싶을때 ReenterantReadWriteLock 을 이용하여 구현할 수 있다.

예를 들어 어떤 데이터를 Map 에다가 마구마구 저장하다가 특정 시점에 Map 담긴 데이터를 외부로 전송하고 다시 Map 을 초기화 할 때 초기화 중간에 데이터가 들어 와 버리면 데이터가 유실 될 수 있기 때문에 Map 을 초기화할 시점에는 하나의 스레드만 실행히 가능하도록 Lock 을 걸 필요가 있다.

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

public class ReentrantReadWriteLockTest {

    private final ReadWriteLock lock = new ReentrantReadWriteLock();
    private final Lock readLock = lock.readLock();
    private final Lock writeLock = lock.writeLock();

    public void read() {

        readLock.lock();

        try {

            // map 을 가지고 쿵짝쿵짝.

        } finally {
            readLock.unlock();
        }
    }

    public void write() {

        writeLock.lock();

        try {

            // map 초기화

        } finally {
            writeLock.unlock();
        }
    }
}

write 메소드의 writeLock.lock() 이 걸리기 전 까지는 여러 쓰레드가 read 메소드를 실행이 가능하다가 write lock 이 걸리게 되면 readLock.lock() 부분에서 blocking 을 당하게 될 것 이다. 그 후 writeLock.unlock() 으로 write lock 이 해제가 되면 다시 blocking 되었던 쓰레드들이 정상적으로 실행되게 된다.

Advertisements

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중