- [Java 정리] Thread 52022년 08월 22일
- starryeye
- 작성자
- 2022.08.22.:20
이미 알던 지식이지만, 기본으로 돌아가서.. Java의 관점에서 한번 정리해보자.
Lock과 Condition을 이용한 동기화
java.util.concurrent.locks 패키지가 제공하는 lock 클래스들을 이용한 동기화 방법에 대해 알아보자.
(JDK1.5)
ReentrantLock 클래스
재진입이 가능한 lock, 가장 일반적인 배타 lock이다.
앞서 wait(), notify() 메서드 처럼..
특정 조건에서 lock을 풀고 나중에 다시 lock을 획득하여
이후의 임계영역 작업을 수행할 수 있다.
ReentrantReadWriteLock 클래스
읽기를 위한 lock과 쓰기를 위한 lock을 제공한다.
읽기를 위한 lock이 이미 걸려있는데 다른 쓰레드가 읽고 싶으면
읽기 lock을 중복해서 걸고 읽기를 수행할 수 있다.
하지만, 읽기를 위한 lock이 걸려있으면 쓰기를 위한 lock을 거는 것은 제한되며
쓰기를 위한 lock이 걸려있으면 읽기를 위한 lock을 거는 것도 제한된다.
StampedLock 클래스 (JDK1.8)
ReentrantReadWriteLock 클래스에 낙관적인 읽기 lock 이 추가된 버전이다.
낙관적 읽기 lock(optimistic reading lock)은..
쓰기 lock이 읽기 lock 보다 우선권을 갖는 lock이다.
읽기 lock이 걸려있는데 쓰기 lock을 얻으려 하면 읽기 lock은 바로 풀리고 쓰기 lock이 걸린다.
쓰기 lock이 걸려있는데 읽기 lock을 얻으려 하면 쓰기 lock이 풀릴때 까지 대기해야한다.
주요 메서드
void lock() //락을 건다. void unlock() //락을 해제한다. boolean isLocked() //락이 잠겨있는지 확인한다. boolean trylock() boolean trylock(long timeout, TimeUnit unit) throws InterruptedException
lock 메서드는 호출 시, 다른 쓰레드에서 락을 가지고 있어서 획득하지 못하면 그 자리에서 대기한다.(쓰레드 블락)
trylock은 락이 걸려있으면 false를 반환, 락이 걸려있지 않다면 true를 반환하면서 락을 획득한다.
따라서 개발자는 false라면 다른 작업을 수행하게끔 개발하면 응답성을 향상 시킬 수 있다.
파라미터가 있는 trylock은 개발자가 지정 시간동안 lock을 얻을 수 있도록 대기 시간을 줄 수 있다.
대기 도중에 interrupt를 발생시키면 lock을 얻는 작업을 취소할 수 있도록 코드를 작성할 수 있다.
Condition 클래스
lock 클래스에서 생성 가능한 클래스이다.
waiting pool을 용도에 맞게 여러개 생성하는 것이라 보면 된다.
-> wait(), notify()에서는 하나의 객체엔 하나의 waiting pool이 존재하였다..
-> 하나의 객체에 Condition 객체를 여러개 만들 수 있게 됨으로써 쓰레드를 구분하여 통지 할 수 있게 한다.
private ReentrantLock lock = new ReentrantLock; private Condition forA = lock.newCondition(); private Condition forB = lock.newCondition();
위와 같이 lock 클래스에서 생성후 반환 받는다.
Condition 클래스의 메서드
void await(); //wait boolean await(long time, TimeUnit unit); //wait void signal(); //notify void signallAll(); //notifyAll
Condition 마다 await(), signal() 메서드가 존재하여 쓰레드를 구분하여 통지 할 수 있다.
<단점>
개발자가 구분 지어 놓은 쓰레드의 종류에 따라 구분이 가능하지만..
같은 종류의 쓰레드간 기아 현상과 경쟁 상태는 여전히 문제로 남아있다.
(같은 종류지만.. 더 세분화 해줘야 하는 경우가 발생할 수 있음)
'Java' 카테고리의 다른 글
[Java 정리] ThreadLocal (0) 2022.10.19 [Java 정리] Thread 6 (0) 2022.08.22 [Java 정리] Thread 4 (0) 2022.08.22 [Java 정리] Thread 3 (0) 2022.08.19 [Java 정리] Thread 2 (0) 2022.08.13 다음글이전글이전 글이 없습니다.댓글