JAVA/포스팅

자바 쓰레드 Condition을 이용한 동기화

짜집퍼박사(짜박) 2023. 11. 22. 00:48

Condition은 명시적인 락과 함께 사용되어 특정 조건이 충족될 때까지 대기하거나 신호를 보내는 데 사용됩니다. Condition은 Lock 인터페이스의 일부이며, 주로 ReentrantLock 클래스와 함께 사용됩니다.

아래는 Condition을 이용한 동기화의 간단한 예제입니다.

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class SharedResource {
    private final Lock lock = new ReentrantLock();
    private final Condition condition = lock.newCondition();
    private boolean isDataAvailable = false;

    public void produceData() {
        lock.lock();
        try {
            // 생산 작업 수행

            isDataAvailable = true;
            condition.signal(); // 대기 중인 쓰레드에게 신호를 보냄
        } finally {
            lock.unlock();
        }
    }

    public void consumeData() throws InterruptedException {
        lock.lock();
        try {
            while (!isDataAvailable) {
                condition.await(); // 조건이 충족될 때까지 대기
            }

            // 소비 작업 수행
            isDataAvailable = false;
        } finally {
            lock.unlock();
        }
    }
}

이 예제에서 ReentrantLock과 함께 Condition을 사용하여 데이터의 생산과 소비를 조절하고 있습니다. produceData 메서드는 데이터를 생산하고, consumeData 메서드는 데이터를 소비합니다. consumeData에서는 await() 메서드를 사용하여 조건(isDataAvailable)이 충족되지 않으면 대기하고, signal() 메서드를 사용하여 조건이 충족되면 대기 중인 쓰레드에게 신호를 보냅니다.

Condition을 사용하면 더 세밀한 동기화 제어가 가능하며, 여러 개의 Condition을 사용하여 서로 다른 조건에 대한 대기와 신호를 구현할 수 있습니다.

 

With ChatGPT

'JAVA > 포스팅' 카테고리의 다른 글

자바 쓰레드 join 프레임웍  (0) 2023.11.22
자바 쓰레드 volatile  (0) 2023.11.22
자바 쓰레드 Lock을 이용한 동기화  (0) 2023.11.22
자바 쓰레드 Lock  (0) 2023.11.22
자바 쓰레드 notify()  (0) 2023.11.22