2011-11-20 5 views
3

나는 이것이 반복되는 질문이라는 것을 알고 있습니다. 그러나 나는 그 설명으로 이해할 수 없다. 나는 좋은 예를 들고 그것을 이해하기를 원합니다. 누구든 도와주세요.대기, 동기화 된 컨텍스트에서 메서드를 알립니다.

"왜 우리는 동기화 된 컨텍스트에서 wait(), notify() 메서드를 호출할까요?".

+0

아무도 답변을 드릴 수 있습니까? – aj983

+0

동기화를 기다리지 않는다면 기다림과 알림은 아무런 의미가 없습니다. 동기화 할 때 사용하지 않으면 효과가 없습니다. – ben

+0

저도 압니다. 그러나 나는 그것들을 동기화 된 맥락에서 불러오는 이유가 무엇인지 묻는다. – aj983

답변

0

우리가 스레드에서 동기화를 사용할 때, 이는 해당 객체를 잠그는 것을 의미하며, 여러 스레드의 동시성 문제를 피하기 위해 한 번에 하나의 스레드에서만 해당 객체를 사용할 수 있습니다.

wait() 및 notify() 메소드는 동기화 된 컨텍스트에서만 사용됩니다.

wait 메서드는 현재 스레드의 작업을 일시 중지하고 다른 스레드에서 동기화 된 개체를 사용할 수 있도록 모든 개체에서 보유하고있는 잠금을 해제합니다.

다른 스레드가 작업을 완료하면 notify 메소드를 호출하여 첫 ​​번째 스레드가 오브젝트에 대한 잠금을 다시 얻고 작업을 재개하도록합니다.

그물에서 쉽게 예제를 얻을 수 있습니다.

0

주로 스레드 간 통신을 위해 wait() 및 notify() 또는 notifyAll() 메서드를 사용합니다.

조건을 확인한 후에 하나의 스레드가 대기 중입니다. 프로듀서에서 컨슈머 예제 프로듀서 쓰레드는 버퍼가 가득 찼을 때 대기하고 있고 컨슈머 쓰레드는 프로듀서 쓰레드에게 엘리먼트를 소비하여 버퍼에 공간을 생성 한 후 통지합니다. notify() 또는 notifyAll() 호출은 조건이 변경된 알림을 단일 또는 다중 스레드에 발행하고 통지 스레드가 동기화 된 블록을 떠나면 대기중인 모든 스레드가 대기중인 객체 잠금을 위해 싸우며 행운의 스레드는 락을 재 취득한 후에 wait() 메소드를 호출 해, 계속 진행합니다. 우리가 시나리오를 더 잘 이해하기 위해 농산물 소비자 스레드 예제를 사용합니다,의 자바에서) 방법을 대기 (사이의 경쟁 조건의 가능성을 참조) (통지 단계에서이 모든 작업을 나누어 보자

  1. 생산자 스레드가 테스트 조건 (버퍼가 꽉 찼거나 아닌지)을 확인하고 기다려야한다는 것을 확인합니다 (버퍼가 가득 찼음을 확인한 후).
  2. 소비자 스레드는 버퍼에서 요소를 소비 한 후 조건을 설정합니다.
  3. 소비자 스레드는 notify() 메서드를 호출합니다. 프로듀서 스레드가 아직 대기 상태가 아니기 때문에 이것은 들리지 않습니다.
  4. 생산자 스레드는 wait() 메서드를 호출하고 대기 상태가됩니다.

여기 경쟁 조건으로 인해 알림이 손실되고 버퍼 또는 요소 하나만 사용하면 제작 스레드가 영원히 기다리고 프로그램이 중단됩니다. 결론적으로 경쟁 조건을 피하기 위해 wait(), notify() 및 notifyAll()이 동기화 된 컨텍스트에서 호출됩니다.

HTH.

+0

또는이 링크를 제공 할 수 있습니다. http : //javarevisited.blogspot.co.kr/2011/05/wait-notify-and-notifyall-in-java.html – Anshu

관련 문제