///////
Search
💫

하나의 쓰기 스레드와 여러 읽기 스레드가 존재할 때 사용되어야 하는 Java의 동기화 기능은 무엇이고 어떻게 동작하게 되는지 설명해주세요.

⇒ ReentrantReadWriteLock

Lock

쓰레드를 동기화할 수 있는 또다른 방법으로, 'java.util.concurrent.locks'패키지에서 제공된다
synchronized 블럭을 사용하면 자동으로 lock이 잠기고 풀리기 때문에 간편하지만 쓰레들를 구분해서 락을 통제하는 것이 불가능하다. 이럴 때 lock 클래스를 사용할 수 있다
Lock의 종류
1.
Reentrant Lock
2.
ReentrantReadWriteLock
3.
StampedLock
Reentrant Lock
Synchronized는 쓰레드가 락을 한번만 사용할 수 있지만, reentrant lock은 쓰레드가 다시 lock을 걸 수 있도록 한다
lock , unlock 메서드를 통해 lock의 시작과 종료를 명시적으로 작성해줄 수 있다.
synchronized의 경우 기본적으로 스레드간의 락을 획득하는 순서를 보장해주지 않는다. 따라서 아사 현상이 생길 수 있다. 이러한 것을 불공정 방법이라고 하는데 RenntrantLock은 불공정방법뿐만 아니라 메소드를 이용해 순서를 보장해 주도록 (공정방법)으로 설정 할 수 있다
ReentrantReadWriteLock
Read lock 과 write lock 을 제공
여러 쓰레드가 read lock을 동시에 사용할 수 있지만 write lock은 걸 수 없다
쓰기 lock이 걸려있으면 동시에 read나 write lock을 걸 수 없다
Stamped Lock
재진입 불가능
읽기와 쓰기를 위한 lock 외에 '낙관적 읽기 lock(optimistic reading lock)'이 추가되었다
낙관적 읽기 lock이 걸려있으면, 쓰기 lock에 의해 바로 풀리게 된다