Bom dia, estou tentando representar um exercício simples para trabalhar com Threads em Java, hoje tentei implementar um programa que cria 4 Threads e cada uma acessa uma variável compartilhada que faz o incremento da mesma, a intenção é evitar que mais de uma thread acesse essa variável ao mesmo tempo usando a palavra reservada synchronized. Porém quando executo meu código varias vezes, há algumas situações que aparentemente mais de uma thread é acessada ao mesmo tempo. Por exemplo:
saída recebida:
Thread-3 2
Thread-0 1
Thread-1 2
Thread-2 3
pois a saída esperada era:
Thread-3 0
Thread-0 1
Thread-1 2
Thread-2 3
Não necessariamente nessa ordem de thread, mas obrigatoriamente os números em negrito devem ser únicos.
Gostaria de saber porque a palavra reservada synchronized não está surtindo efeito, e o código está executando como se não a tivesse.
Segue o código do programa:
Class ThreadRunnable.java:
package com.threads.implementacao;
import java.util.logging.Level;
import java.util.logging.Logger;
public class ThreadRunnable implements Runnable {
private String nome;
private int tempo;
public static int i = -1;
public ThreadRunnable(String nome, int tempo) {
this.nome = nome;
this.tempo = tempo;
Thread t = new Thread(this);
t.start();
}
@Override
public synchronized void run() {
i++;
System.out.println(Thread.currentThread().getName() + ":" + i);
}
}
Class ThreadExecute.java:
package com.threads.implementacao;
public class ThreadExecute {
public static void main(String[] args) {
ThreadRunnable thread1 = new ThreadRunnable("#0", 500);
ThreadRunnable thread2 = new ThreadRunnable("#1", 500);
ThreadRunnable thread3 = new ThreadRunnable("#2", 500);
ThreadRunnable thread4 = new ThreadRunnable("#3", 500);
System.out.println(Thread.currentThread().getName());
}
}