Java: inform() 대 informAll() 재검토
notify()는 하나의 대기 스레드만 깨우고 informAll을 실행한다고 자주 언급되지만 ()는 모든 대기 스레드를 깨우고 실제적인 의미를 이해하는 것입니다.
핵심 차이점
두 가지 방법 모두 대기 중인 스레드를 깨우지만 사용된 방법에 관계없이 한 번에 하나의 스레드에만 모니터 획득 권한이 부여됩니다. 이 선택 프로세스는 비결정적이며 VM 또는 기본 시스템 스레드 스케줄러에 따라 달라집니다.
notifyAll()의 값
대부분의 시나리오에서 informAll()은 다음과 같습니다. inform()보다 고용되어야 합니다. inform()을 사용하면 하나의 스레드만 선택하여 실행할 수 있다. 다음 예에서 설명한 것처럼 이로 인해 교착 상태가 발생할 수 있습니다.
public class ProducerConsumerBroken { private Object[] buf; public synchronized void put(Object o) { while (buf.length == MAX_SIZE) wait(); buf[next] = o; notify(); } public synchronized Object get() { while (buf.length == 0) wait(); return buf[next--]; } }
이 예에서는 시스템 스레드 스케줄러가 계속해서 하나의 스레드를 선호하고 다른 스레드는 무기한 일시 중단될 수 있기 때문에 통지()로 인해 교착 상태가 발생할 수 있습니다.
notifyAll()을 사용한 교착 상태 방지
사용 informAll(), 대기 중인 모든 스레드(있는 경우)가 깨어나 각 스레드가 잠금을 획득하고 진행할 수 있는 공정한 기회를 제공합니다. 이렇게 하면 교착 상태가 발생할 가능성이 제거됩니다.
notifyAll() 사용 시기
대기 중인 모든 스레드에 개체가 전달되었음을 알리고 싶을 때마다 informAll()을 사용하십시오. 기다리고 있는 것이 바뀌었습니다. 이는 어떤 스레드가 알림을 받아야 하는지 예측할 수 없거나 여러 스레드가 동일한 잠금에서 대기 중인 경우에 특히 중요합니다.
권장사항
일반적으로 경험상 항상 informAll()을 사용하십시오. 이렇게 하면 잠재적인 교착 상태를 방지하고 스레드 예약의 공정성을 보장할 수 있습니다.
위 내용은 Java에서 `notifyAll()`을 언제 사용해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!