[RESOLVIDO]Metodo Sincronizado

3 respostas
T

Me deparei com a seguinte questao e nao consegui entender como um método sincronizado poderia gerar a seguinte saida

public class PingPong implements Runnable{

    
    
    public static void main(String[] args)
    {
        new Thread(new PingPong()).start();
        new Thread(new PingPong()).start();
    }
    
    
    synchronized void hit(long n)
    {
        for(int i = 1 ;i<3;i++)
        {
            System.out.println(n + "-" + i + " ");
        }
    }
    @Override
    public void run() {
        hit(Thread.currentThread().getId());
    }
    
}

output: 8-1 7-1 7-2 8-2

Devido ao fato do método ser sincronizado, nao deveria ser executado um for , depois liberado a chave e executado o outro?

Muito obrigado a todos desde ja !

3 Respostas

Laubstein_M_cio

Isso ocorre porque são 2 threads diferentes, cada uma está chamando o seu método. Para realizar o seu teste, você deve criar uma classe com o método synchronized e compartilhar uma instancia desse objeto em 2 threads que invocaram o método sincronizado.

Longo caminho no mundo concorrente, indico esse livro: http://www.amazon.com/Java-Concurrency-Practice-Brian-Goetz/dp/[telefone removido]

Abs

ViniGodoy
Como o Laubstein falou, para a sincronização ocorrer, as duas threads teriam que estar no mesmo pingpong, como no código abaixo:
public class PingPong implements Runnable{  
    public static void main(String[] args) {
        PingPong onlyOne = new PingPong();
        new Thread(onlyOne).start();
        new Thread(onlyOne).start();
    }
    
    synchronized void hit(long n) {
        for(int i = 1 ;i&lt;3;i++) {
            System.out.println(n + &quot;-&quot; + i + &quot; &quot;);
        }
    }
    @Override
    public void run() {
        hit(Thread.currentThread().getId());
    }
    
}

Não há nada que impeça duas threads diferentes de acessar objetos diferentes. A sincronização está em locais diferentes, e as variáveis desses objetos se referem a locais de memórias diferentes, portanto, não constituem uma região crítica.

T

Muito obrigado agora consegui entender :smiley:

Criado 23 de maio de 2012
Ultima resposta 24 de mai. de 2012
Respostas 3
Participantes 3