Boa tarde! Estava seguindo o vídeo e no momento que fiz a Thread para anexar valores em saldo o metodo FazDeposito() não estava anexando valores. Sempre que o código rodava, quando iniciei uma new Conta() setei o valor de 500, e no método FazDeposito() setei 100, porém quando o código era rodado, não apresentava erro e sempre o resultado era 500, mesmo repetindo vairas vezes, demonstrando que o método FazDeposito() não tinha funcionado. Após utilizar a sincronização o método FazDeposito() funcionou perfeitamente e o resultado foi o esperado. Segue o código:
public class Conta implements Comparable<Conta>{
protected String nome;
public String getNome() {
return this.nome;
}
protected double saldo;
public double getSaldo() {
return this.saldo;
}
protected String agencia;
public String getAgencia() {
return this.agencia;
}
protected int numero;
public int getNumero() {
return numero;
}
public Conta(double valor, String texto, String txt) {
this.saldo = valor;
this.nome = texto;
this.agencia = txt;
}
public synchronized void deposita(double valor) {
this.saldo += valor;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + numero;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Conta other = (Conta) obj;
if (numero != other.numero)
return false;
return true;
}
public String toString() {
return "A conta de: " + this.getNome() + " da Agência: " + this.getAgencia() + " Tem saldo de: " + this.getSaldo() + " R$";
}
public int compareTo(Conta outra) {
//return this.getNumero() - outra.getNumero();
return this.nome.compareTo(outra.nome);
}
}
import Classes.Conta;
public class FazDeposito implements Runnable {
private final Conta conta;
public FazDeposito(Conta conta) {
this.conta = conta;
}
@Override
public void run() {
conta.deposita(100.0);
}
}
import Classes.Conta;
public class TestaConCorrencia {
public static void main(String[] args) throws InterruptedException {
Conta c1 = new Conta(500.0, "Pablo", "abc123");
FazDeposito acao = new FazDeposito(c1);
Thread t1 = new Thread(acao);
Thread t2 = new Thread(acao);
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println(c1.getSaldo());
}
}
Observação: desconsidere a sincronização, tirando isso o código é o mesmo que apresentava o problema relatado acima. Atenciosamente,