[RESOLVIDO]Metodo Sincronizado

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 !

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/0321349601

Abs

Como o Laubstein falou, para a sincronização ocorrer, as duas threads teriam que estar no mesmo pingpong, como no código abaixo:

[code]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());
}

}
[/code]

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.

Muito obrigado agora consegui entender :smiley: