Pergunta

Eu tenho uma peça de código que estou revisando (usando FindBugs).

public class MyClass{
...
private BlockedQueue q = new LinkedBlockingQueue<MyData>(1000);
private static final batchSize = 1000;

public boolean testMethod(){
    boolean done = false;
    synchronized(q){
       if(q.size == batchSize){
         q.notify();
         done = true;
       }
    }
    return done;

}

Quando eu corro FindBugs neste pedaço de código, ele reclama que -

Este método executa a sincronização de um objeto que é uma instância de uma classe do pacote java.util.Concurrent (ou suas subclasses). As instâncias dessas classes têm mecanismos de controle de simultaneidade próprios que são distintos e incompatíveis com o uso da palavra -chave sincronizada.

Se eu comentar a peça de código sincronizada synchronized(q){, reclama -

Este método chama Object.Notify () ou Object.NotifyAll () sem obviamente segurar uma trava no objeto. Chamar notify () ou notifyAll () sem trava resultará em uma ilegalMonitorStateException sendo jogada

Como eu implementaria esse método para que ele passe a validação do FindBugs? A implementação acima é correta para notificação em casos para classes simultâneas?

Obrigada.

Foi útil?

Solução

notify() vai junto com wait() e não deve ser usado com classes de java.util.concurrent.

BlockingQueue usa mecanismos internos para bloquear em um put() Se não houver espaço para mais elementos ou em poll() Se não houver elemento a se consumir. Você não precisa se preocupar com isso.

Outras dicas

O primeiro erro é afirmar que você não deve usar controles de sincronização primitiva nas classes java.util.concurrent (como o BlockingQueue).

Geralmente, essa é uma boa prática, pois eles cuidam da sincronização para você. Eu imagino que existe uma maneira melhor de resolver seu problema em mãos. Qual é o problema real que você está tentando resolver?

O segundo erro é causado pelo fato de que você deve possuir o bloqueio/monitor de um objeto (por sychronizando nele) para chamar Wait/Notify/NotifyAll nele

BlockingQueue é a sincronizador Objeto - coordena o fluxo de controle de roscas com base em seu estado e, portanto, controla o fluxo de fios produtores/consumidores porque leva e colocar Bloqueie até que a fila entre no estado desejado (não vazio ou não cheio).

Também a boa prática em programação de simultaneidade pressupõe que a espera e a notificação sejam colocadas durante o loop.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top