Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java wait()과 sleep() 메서드의 차이점 완벽 정리

wait() 메서드란?

wait() 메서드는 스레드가 해당 객체 모니터(object monitor)의 소유권을 해제하고 대기 상태에 진입하도록 만듭니다. 이후 다른 스레드가 notify() 또는 notifyAll() 메서드를 호출하여 이 객체의 모니터에서 대기 중인 스레드를 깨워줄 때까지 기다립니다. 깨어난 스레드는 모니터 소유권을 다시 획득할 수 있을 때까지 대기한 뒤, 실행을 재개합니다.

중요한 점은 wait()는 반드시 synchronized 블록이나 메서드 내부에서 호출해야 하며, 그렇지 않으면 IllegalMonitorStateException이 발생한다는 것입니다.

sleep() 메서드란?

sleep() 메서드는 현재 실행 중인 스레드를 지정된 밀리초(ms) 동안 일시적으로 멈추게 하는 메서드입니다. 스레드가 잠자는 동안에도 어떤 모니터의 소유권도 잃지 않으며, 지정된 시간 동안 현재 스레드를 'Not Runnable(실행 불가능)' 상태로 전환합니다.

sleep()은 Thread 클래스의 static 메서드이므로 어디서든 호출할 수 있고, sleep 중인 스레드가 인터럽트되면 InterruptedException이 발생합니다.

wait() vs sleep() 주요 차이점 비교표

번호구분 기준wait()sleep()
1소속 클래스Object 클래스에 속한 메서드입니다.Thread 클래스에 속한 메서드입니다.
2락(Lock) 해제객체에 대한 락을 해제합니다.객체의 락을 해제하지 않고 유지합니다.
3호출 방식객체 자체에 대해 호출할 수 있습니다.스레드에 대해 호출합니다(static 메서드).
4깨어나는 조건다른 스레드가 notify() 또는 notifyAll()을 호출할 때까지 대기합니다.지정된 시간이 경과하거나 interrupt()가 호출될 때까지 대기합니다.
5허위 기상(Spurious Wakeup)허위 기상(spurious wakeup)이 발생할 수 있으므로 while 루프로 조건을 재확인해야 합니다.허위 기상이 발생하지 않습니다.

synchronized 블록 활용 예제

아래 예제는 wait()sleep()이 실제 코드에서 어떻게 사용되는지 보여줍니다. wait()는 synchronized 블록 안에서 조건 확인과 함께 사용되며, sleep()은 단순히 현재 스레드를 일시 정지하는 용도로 사용됩니다.

synchronized(lockedObject){
    while(condition == true){
        lockedObject.wait(); // lockedObject의 락을 해제하고 대기
    }
    Thread.sleep(100); // 현재 스레드를 100ms 동안 일시 정지
}

정리

wait()는 스레드 간 통신(inter-thread communication)을 위해 설계되었으며 락을 해제한다는 점이 핵심입니다. 반면 sleep()은 단순히 일정 시간 동안 실행을 멈추기 위한 목적이며 락을 유지합니다. 따라서 공유 자원의 동기화가 필요한 상황이라면 wait()/notify() 메커니즘을, 단순한 시간 지연이 필요하다면 sleep()을 사용하는 것이 적절합니다.