본문 바로가기
프로그래밍 놀이터/안드로이드, Java

[Java] Condition 은 어떻게 쓰는걸까? 예를 통해 함 보자.

by 돼지왕 왕돼지 2017. 5. 12.
반응형

 

await, boundedbuffer, condition, Consumer, Example, Java, LOCK, lock 해제, monitor pattern, Notify, object, object.wait, Producer, sample, Signal, tutorial, Wait, [Java] Condition 은 어떻게 쓰는걸까? 예를 통해 함 보자.

 

-

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 들을 사용해야 한다는 것..

 

 

 

반응형

댓글