Non-fair, Fair mode of Lock

멀티 쓰레딩 환경에서 리소스의 쓰기 대비 읽기가 많은 기능의 경우 성능을 고려하여 synchronized를 사용하지 않고 ReentrantReadWriteLock을 사용하는 경우가 있다.
하지만 이 경우에도 고려해야할 점이 있다. 바로 리소스 접근 우선순위이다.

만약 readLock을 사용하여 읽기 중인 리소스에 writeLock을 사용하여 쓰기를 시도한다고 가정하자.
이때 만약 read가 계속해서 들어온다면 write는 read가 모두 끝날 때 까지 write 권한을 획득할 수 없게된다.

정말 만약의 경우 read가 계속 들어오면 write는 끝까지 write 권한을 얻을 수 없게 될 것이다.
이런 경우를 피하기 위해 Non-fair modeFair mode가 있다.

아래는 ReentrantReadWriteLock의 javadoc의 일부를 발췌한 것이다.

Non-fair mode (default)

When constructed as non-fair (the default), the order of entry to the read and write lock is unspecified, subject to reentrancy constraints. A nonfair lock that is continuously contended may indefinitely postpone one or more reader or writer threads, but will normally have higher throughput than a fair lock.

Fair mode

When constructed as fair, threads contend for entry using an approximately arrival-order policy. When the currently held lock is released, either the longest-waiting single writer thread will be assigned the write lock, or if there is a group of reader threads waiting longer than all waiting writer threads, that group will be assigned the read lock.

위 내용을 토대로 Fair mode를 사용한다면 앞의 예제의 write 무한 대기 문제를 해결할 수 있다.

하지만 뭐든 trade off는 있는 법이다.
writeLock의 권한 획득을 위한 대기 시간(이전 readLock이 풀릴 때까지의 시간)과 writeLock이 걸리고 풀릴 때 까지의 시간이 길어질 경우 writeLock 이후의 read 쓰레드는 그 만큼의 지연이 생길 수 밖에 없다.

참고 :

Share