Olá amigos, estou com um problema no uso de threads. Quando temos informações compartilhados por threads é preciso tomar alguns cuidados para que não aconteçam resultados indesejáveis.
Neste meu código:
public class Teste
{
public static void main( String argumentos[] )
{
PrimeThread p = new PrimeThread();
PrimeThread q = new PrimeThread();
p.start();
q.start();
}
}
class PrimeThread extends Thread
{
public static int x = 5;
public void run()
{
synchronized(this) {
PrimeThread.x++;
System.out.println(PrimeThread.x);
PrimeThread.x--;
System.out.println(PrimeThread.x);
}
}
}
Crio dois threads com o mesmo conteúdo e os executo. Quando um thread chega no synchronized(this) { ele deve executar todas as instruções deste bloco antes do outro thread continuar sua execução. Isso evita a intercalação de instruções e por consequência possíveis resultados indesejáveis.
A variável x inicia com o valor 5. O 1° primeiro thread a entrar no bloco synchronized(this) { acrescentaria 1 a essa variável, deixando ela com o valor 6. Este valor é impresso. Agora o valor da variável é decrementado, ficando 5. Novamente este valor é impresso. Somente após o término do bloco, o outro thread criado poderia continuar sua execução, entrar no seu bloco synchronized(this) { e repetir o mesmo processo do thread anterior.
O resultado da execução do programa deveria ficar assim:
6
5
6
5
Mas ele atinge com mais frequencia os resultados:
6
6
7
5
e
7
6
7
5
O que com certeza não é o esperado.
Será que o fato do meu processador possuir mais de um núcleo está causando esse problema? Se sim, como solucionar?
Desde já agradeço. =)