wait/notify 키워드의 이해에 대해 이야기하다

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() 방법이 실행된 후와 다르다.
 
(1) 만약에 라인이 대상의wait() 방법을 호출한다면 라인은 이 대상의 대기 탱크에 있고 대기 탱크의 라인은 이 대상의 자물쇠를 경쟁하지 않는다.
(2) 라인이 대상의 notify All () 방법 (모든wait 라인을 깨우기) 이나 notify () 방법 (무작위로wait 라인만 깨우기) 을 호출하면, 깨어난 라인이 대상의 자물쇠에 들어가 자물쇠의 라인이 대상의 자물쇠를 경쟁하게 된다.
(3) 우선순위가 높은 라인이 대상 자물쇠에 경쟁할 확률이 높다. 만약에 어떤 라인이 대상 자물쇠에 경쟁하지 않으면 자물쇠에 남는다. 라인이 다시wait() 방법을 사용해야만 다시 대기 탱크로 돌아갈 수 있다.대상 자물쇠를 경쟁하는 라인은 synchronized 코드 블록이 실행될 때까지 계속 아래로 실행됩니다. 이 대상 자물쇠를 방출할 것입니다. 이 때 자물쇠 탱크의 라인은 대상 자물쇠를 계속 경쟁합니다.

좋은 웹페이지 즐겨찾기