Java에서 모든 클래스의 최상위 클래스는 Object
클래스이다. 이 클래스는 모든 객체가 기본적으로 사용할 수 있는 여러 메서드를 제공한다. 그중에서도 스레드 동기화를 위해 사용되는 중요한 메서드로 wait()
, notify()
, notifyAll()
이 있다.
toString()
: 객체의 문자열 표현을 반환한다.hashCode()
: 객체의 해시 코드를 반환한다.wait()
: 호출한 스레드가 갖고 있던 고유 락을 해제하고, 스레드를 잠들게 한다.notify()
: 잠들어 있던 스레드 중 임의의 하나를 깨운다.notifyAll()
: 잠들어 있던 모든 스레드를 깨운다.wait()
, notify()
, notifyAll()
메서드는 반드시 고유 락을 가지고 있는 상태에서 호출되어야 한다. 즉, 이 메서드들은 반드시 synchronized
블록 내에서 실행되어야 한다. 그렇지 않으면 IllegalMonitorStateException
이 발생한다.
다음은 wait()
, notify()
, notifyAll()
메서드를 사용하여 스레드 간의 통신을 구현한 예제이다.
class SharedResource {
private boolean available = false;
public synchronized void produce() throws InterruptedException {
while (available) {
wait();
}
System.out.println("Producing resource");
available = true;
notifyAll();
}
public synchronized void consume() throws InterruptedException {
while (!available) {
wait();
}
System.out.println("Consuming resource");
available = false;
notifyAll();
}
}
class Producer extends Thread {
private SharedResource resource;
public Producer(SharedResource resource) {
this.resource = resource;
}
@Override
public void run() {
try {
while (true) {
resource.produce();
Thread.sleep(500); // 생산 속도를 조절하기 위한 대기 시간
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class Consumer extends Thread {
private SharedResource resource;
public Consumer(SharedResource resource) {
this.resource = resource;
}
@Override
public void run() {
try {
while (true) {
resource.consume();
Thread.sleep(500); // 소비 속도를 조절하기 위한 대기 시간
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public class Main {
public static void main(String[] args) {
SharedResource resource = new SharedResource();
Producer producer = new Producer(resource);
Consumer consumer = new Consumer(resource);
producer.start();
consumer.start();
}
}
produce()
메서드: 자원을 생성하는 메서드로, 자원이 이미 존재하면 대기(wait()
)하고, 자원이 없으면 자원을 생성하고 대기 중인 소비자를 깨운다(notifyAll()
).consume()
메서드: 자원을 소비하는 메서드로, 자원이 없으면 대기(wait()
)하고, 자원이 있으면 자원을 소비하고 대기 중인 생산자를 깨운다(notifyAll()
).SharedResource
객체를 받아서 자원을 생성하는 스레드이다.SharedResource
객체를 받아서 자원을 소비하는 스레드이다.SharedResource
객체를 생성하고, 생산자와 소비자 스레드를 시작한다.wait()
, notify()
, notifyAll()
메서드는 Java에서 스레드 간의 동기화를 위해 매우 유용하게 사용된다. 이 메서드들은 반드시 synchronized
블록 내에서 호출되어야 하며, 이를 통해 스레드 간의 통신을 구현할 수 있다. 이 메서드들을 잘 활용하면 스레드 간의 자원 공유 문제를 효율적으로 해결할 수 있다.