Object 메서드의 wait, notify, notify All 메서드

1904 단어

wait()

public final void wait() throws InterruptedException,IllegalMonitorStateException

이 방법은 알림을 받거나 중단될 때까지 현재 라인을 휴면 상태로 두는 데 사용됩니다.wait () 를 호출하기 전에, 라인은 이 대상의 대상 단계 잠금을 받아야 합니다. 즉, 동기화 방법이나 동기화 블록에서만 wait () 방법을 호출할 수 있습니다.wait () 방법에 들어가면 현재 라인에서 자물쇠를 방출합니다.wait ()에서 돌아오기 전에, 라인은 다른 라인과 경쟁하여 다시 자물쇠를 얻는다.wait () 를 호출할 때 적당한 자물쇠가 없으면 Illegal Monitor State Exception을 던집니다. 이것은 런타임 Exception의 하위 클래스이기 때문에try-catch 구조가 필요하지 않습니다.

notify()

public final native void notify() throws IllegalMonitorStateException

이 방법도 동기화 방법이나 동기화 블록에서 호출해야 한다. 즉, 호출하기 전에 라인도 이 대상의 대상 레벨 자물쇠를 받아야 한다. notify () 를 호출할 때 적당한 자물쇠가 없으면 Illegal Monitor State Exception을 던진다.
이 방법은 대상을 기다릴 수 있는 대상이 잠긴 다른 라인을 알려주는 데 사용된다.만약 여러 개의 라인이 기다리고 있다면, 라인 기획기는 그 중 하나의wait() 상태의 라인을 임의로 선택하여 알림을 보냅니다.이 대상을 가져올 대상 자물쇠를 기다리게 합니다. (notify 후 현재 라인은 이 대상 자물쇠를 바로 풀지 않습니다.wait가 있는 라인은 이 대상 자물쇠를 바로 가져올 수 없습니다.synchronized 코드 블록을 종료한 후에 현재 라인은 자물쇠를 풀고,wait가 있는 라인도 이 대상 자물쇠를 가져올 수 있습니다.) 그러나 이 대상을 기다리는 다른 라인들도 놀라지 않습니다.첫 번째로 이 대상 자물쇠를 획득한wait 라인이 실행된 후에 이 대상 자물쇠를 방출합니다. 이 대상이 notify 문장을 다시 사용하지 않으면, 대상이 비어 있어도 다른wait 상태에서 기다리는 라인은 이 대상에게 알림을 받지 못해서wait 상태에서 이 대상이 notify나 notify All을 보낼 때까지 계속 막힙니다.여기서 주의해야 할 것은 자물쇠가 아닌 notify나 notify All에 의해 기다리는 것이다.이것은 아래의 notifyAll() 방법이 실행된 후와 다르다.

notifyAll()

public final native void notifyAll() throws IllegalMonitorStateException

이 메서드는 notify () 메서드와 작동 방식이 같으며 중요한 차이점은 다음과 같습니다.
notify All은 원래 이 대상의wait 라인을 모두wait에서 종료하는 상태(즉 모두 깨어나 notify나 notify All을 기다리지 않지만 이 대상 자물쇠를 얻지 못했기 때문에 계속 실행할 수 없음)로 이 대상의 자물쇠를 가져오기를 기다리는 것으로 변경됩니다. 이 대상 자물쇠가 풀리면(notify All 라인이 종료되면 notify All의synchronized 코드 블록을 호출할 때)그들은 경쟁하러 갈 것이다.만약 그 중 한 라인이 이 대상의 자물쇠를 얻게 된다면, 그 라인은synchronized 코드 블록을 종료하고, 자물쇠를 풀면, 다른 깨어난 라인은 이 자물쇠를 얻기 위해 계속 경쟁하고, 깨어난 모든 라인이 실행될 때까지 계속될 것이다.

좋은 웹페이지 즐겨찾기