반응형
-
Condition 에 대해 예로 잘 등장하는 코드는 아래와 같다. ( Oracle Java Doc 에 나와 있는 코드 )
/**
* 이 Buffer 는 array index 재배치를 하지 않고, front 와 rear 값을 두고 control 해서 rear < front 일수도 있는 형태이다.
*/
public class BoundedBuffer {
private final String[] buffer;
private final int capacity;
private int front;
private int rear;
private int count;
private final Lock lock = new ReentrantLock();
private final Condition notFull = lock.newCondition();
private final Condition notEmpty = lock.newCondition();
public BoundedBuffer(int capacity) {
super();
this.capacity = capacity;
buffer = new String[capacity];
}
public void deposit(String data) throws InterruptedException {
lock.lock();
try {
while (count == capacity) {
notFull.await(); // not full condition 이 될 때까지 대기한다.
}
buffer[rear] = data;
rear = (rear + 1) % capacity;
count++;
notEmpty.signal(); // not empty condition 이 충족되었음을 알린다.
} finally {
lock.unlock();
}
}
public String fetch() throws InterruptedException {
lock.lock();
try {
while (count == 0) {
notEmpty.await(); // not empty condition 이 될때까지 기다린다.
}
String result = buffer[front];
front = (front + 1) % capacity;
count--;
notFull.signal(); // not full condition 이 충족되었음을 알린다.
return result;
} finally {
lock.unlock();
}
}
}
-
우선 한번 더 정리하자면... Condition 은 Object 에 대한 wait & notify 의 확장판이라고 볼 수 있다.
조금 더 많은 함수를 제공한다.
-
Condition 의 await 가 불리면 자동으로 잡고있는 lock 이 해제된다. ( Object.wait 와 매한가지 )
-
Condition 은 producer & consumer pattern 에서 잘 어울린다.
주의할 것은 condition 을 파생시킨 Lock 의 lock 을 잡고 condition 들을 사용해야 한다는 것..
반응형
'프로그래밍 놀이터 > 안드로이드, Java' 카테고리의 다른 글
[Java] Subclass 는 Serializable 을 구현하고, Superclass 는 그렇지 않은 경우. (0) | 2017.05.16 |
---|---|
[android] Uri.getQueryParameter 에 # 들어가면 제대로 파싱 못합니다. (0) | 2017.05.15 |
[Java Concurrency] 목차 정리 (0) | 2017.05.11 |
[Java Concurrency] 자바 메모리 모델 (0) | 2017.05.10 |
[Java Concurrency] 단일 연산 변수와 넌블로킹 동기화 (0) | 2017.05.09 |
댓글