1
resposta

Metodo FazDeposito() não setava valores antes da sincronização:

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,

1 resposta

Opa Pablo, realmente olhando o código eu não consegui ver nada de estranho. Tem algum github com o código para eu executar?

PS: perdão pela demora em responder.