Olá Pessoal,
Me encontro com uma dúvida quanto ao modificador Synchronized, talvez eu esteja errando na aplicação, mas fiz um teste aqui e realmente não funcionou, vou colocar os códigos para vocês verem se existe algo errado (que deve existir).
nesse código eu ativo 3 threads para modificar o valor de um objeto e então eu pego o valor modificado junto com o valor da thread para saber se os valores são iguais, teoricamente, pelo uso do synchronized deveria ser, mas não tá sendo... ai vai os códigos:
import java.util.ArrayList;
public class TesteThread {
public static void main(String[] args) {
GuardaNumero gN = new GuardaNumero();
ArrayList<NumeroManage> ns = new ArrayList<NumeroManage>();
for (int x = 0; x < 5; x++){
ns.add(new NumeroManage(("n"+x), gN));
}
NumeroManage nTmp;
while (true){
for (int i = 0; i < 3; i++){
nTmp = ns.get(i);
nTmp.adicione();
// System.out.println(nTmp.name);
if (gN.getNumero() != nTmp.retire()){
System.out.println("Diferente!");
}
}
}
}
}
import java.lang.Math;
public class NumeroManage implements Runnable{
private double numeroTmp;
public String name;
private GuardaNumero gN = null;
private volatile Thread thread;
public NumeroManage(String name, GuardaNumero gN){
this.gN = gN;
thread = new Thread(this, name);
this.name = name;
thread.start();
}
public void run(){
while (true){
adicione();
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void adicione(){
gN.setNumero(gN.getNumero()+(Math.random()*5000));
this.numeroTmp = gN.getNumero();
}
public synchronized double retire(){
return this.numeroTmp;
}
}
public final class GuardaNumero {
private double numero;
/**
* @return the numero
*/
public double getNumero() {
return numero;
}
/**
* @param numero the numero to set
*/
public synchronized void setNumero(double numero) {
this.numero = numero;
}
}
Bom, é isso, se vocês rodarem o código vocês veram que o retorno "Diferente!" acontece com uma grande frequência, o que mostra que o synchronized não está tendo efeito :(!
Valeu e um forte abraço a todos.