Pergunta

O que acontece quando você chamar o método notifyAll em um objeto que não está à espera? Deve haver exceção ou é situação normal?

Foi útil?

Solução

É completamente normal. Você só pode notificar tudo o que espera de um único monitor. Todo mundo não está interessado. O objeto no qual você chama notifyAll é apenas o monitor no qual outros estão esperando. Se ninguém está esperando ninguém para ser notificado

Outras dicas

Como você pode ver aqui, chamando notifyAll () em um objeto não esperando não tem qualquer efeito.

text alt

O objeto é "esperou", sem esperar propriamente dito. O fio é aquele que está esperando. Se ninguém está esperando, ninguém vai acordar e nada de especial vai acontecer.

situação perfeitamente normal.

Vamos dizer que você tem uma fila com um fio produtor colocar elementos em TI e um tópicos de consumo remoção de elementos da mesma.

Agora, o consumidor pode ter esvaziado a fila e ainda ser ocupado com o processamento, de modo que ninguém está à espera para a fila para se tornar não-vazia. Agora o produtor adiciona um novo elemento para a fila. Ele tem que chamar notifyAll () para acordar o consumidor se estivesse à espera. Adicionando lógica adicional para verificar se alguém está esperando e só chamando notifyAll (), nesse caso, acrescentaria considerável (e muito failur propensas) a complexidade do cenário. - É muito mais fácil de notifyAll chamada apenas () cada vez

Apenas esperando objetos ser notificado. Object.wait () bloqueia até um tempo limite ou notificar - Assim a pergunta permanece como ou por que você acha que não espera Objects jamais ser notificado? não faz sentido.

Eu poderia estar cabelos única divisão ;-) Pode não ser estritamente correto pensar de tópicos a ser posta de 'espera' Estado 'correndo' estado em notifyAll; pelo menos não sem a ressalva de que a primeira coisa que um fio notificado faz é regrab o bloqueio monitor. E uma vez que apenas um do número de threads notificados pode agarrá-lo, os outros serão bloqueado . BLOQUEADO ( Thread.State.Blocked ) é o estado do segmento. Mas o bloqueio é não o mesmo que espera porque o segmento bloqueado não precisa de outro sinal de notificar () para retomar. [ Bem, eu sei de espúrias vigília ups mas talvez o oposto também pode ser verdade para algumas implementações de JVM -? A falta notificar ]

public class HellBoy {
    public static class MyThread extends Thread {
        static final public Object sharedLock = new Object();

        public void run() {
            synchronized (sharedLock) {
                System.out.println("Gonna wait...");
                try {
                    sharedLock.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("Woken up but sleeping with the lock");
                try {
                    Thread.sleep(2500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("exiting and unlocking");
            }
        }
    }

    public static void main(String[] args) throws Exception {
        new MyThread().start();
        new MyThread().start();
        new MyThread().start();
        new MyThread().start();
        Thread.sleep(200);
        synchronized (MyThread.sharedLock) {
            MyThread.sharedLock.notifyAll();
        }
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top