English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

java Object wait 메서드 상세 설명

java Object wait 메서드

스레드B가 어떤 공유 자원에 접근할 때, 자원의 锁 객체를 얻으려고 합니다. 그런데 이 锁이 스레드A에 의해 이미 얻혀졌음을 발견하면, 이때 스레드B는 스레드A가 锁을 해제할 때까지 일시 중지됩니다.

하지만, 锁을 얻은 스레드A가 실행 중에, 일부 조건이 아직 충족되지 않아, 계속 실행하려는 생각이 없고, 먼저 기다리려고 합니다.(주의: 이미 锁을 얻은 스레드A가 자발적으로 기다리려고 합니다.), 어떤 조건이 충족되면 실행 작업을 계속하기를 원합니다. 동기화 코드 블록에서, 스레드A는 먼저 锁을 해제해야 하며, 스레드B가 锁을 얻을 수 있는 자격이 생깁니다. 동기화 코드 블록에 진입하여 코드를 실행합니다. 스레드B가 실행이 끝나면, 스레드A가 필요한 조건이 충족되었기 때문에, 이때는 스레드A를 기다리는 상태에서 실행 상태로 변환하는 알림 메커니즘을 가져야 합니다.

일부 학생들은 스레드 A가 반복적으로 조건이 만족되는지 확인할 수 있고, 반드시 스레드를 중단하고 대기하지 않아도 되다고 생각합니다. 실제로 이것도 하나의 접근 방식입니다. 하지만 CPU를 많이 소모하고, 조건이 언제 만족될지 알 수 없기 때문에 이는 비효율적일 수 있습니다.

스레드 간의 조정 및 소통을 위해 대기 메커니즘과 알림 메커니즘을 가져야 합니다. JAVA에서는 이를 wait 메서드와 notify 메서드로 대응합니다.

Object의 wait 메서드

synchronized (obj) {
    while (condition does not ok){
      obj.wait();
    }
 }

스레드 A가 대기 상태로 들어가기 원하면 현재 객체의 wait 메서드를 호출할 수 있습니다. wait 메서드가 호출되면 다음과 같은 의미가 있습니다: 스레드 A는 잠금을 얻었으며, 할 수 있는 모든 작업을 완료했으며, 지금은 대기 상태로 들어갔습니다. 다른 동기화 작업이 특정 코드를 실행한 후에야 일어나서 일을 계속할 수 있습니다.

주의:

wait 메서드는 기본 클래스 Object에 정의되어 있습니다. Thread는 Object 클래스를 상속하므로 자연스럽게 wait 메서드를 가집니다. 하지만 여기서는 현재 스레드 객체의 wait 메서드를 호출하는 것이 아니라, 잠금 속성을 가진 현재 객체의 wait 메서드를 호출합니다. 이 점에 대해 저는 조금 이해가 안 됩니다. 스레드 A가 대기 상태로 전환되고 다른 사람에 의해 깨워지면, 스레드 A의 wait 메서드와 notify 메서드를 사용하면 될 것 같지만, 실제로는 구현이 매우 복잡할 것 같습니다. 또한, 상황적으로 볼 때, wait를 Object에 정의하는 것도 합리적입니다. 이는 스레드가 객체의 대기 풀에 걸린 것을 의미합니다.

감사합니다, 도움이 되길 바랍니다. 많은 사이트 지원에 감사합니다!

좋아하는 것