Problema com thread

o meu código as vezes funciona e da o resultado certo outro não, oque ta errado

class Conta {

private float saldo, valor;

public Conta() { 
   
}
public Conta(float inicial)
{
	saldo = inicial;
}
public float saldo() {
	return saldo;
}

public synchronized void deposita(float valor) {
	saldo = saldo + valor; 
}
public synchronized void retira(float valor) {
	saldo = saldo - valor;
}

}

class ThreadDeposita extends Thread {

private Conta c;

ThreadDeposita(Conta c) { 
	this.c = c;
}

public void run() {
	for (int i = 0; i < 10; i++) // faz 10 depositos de 100
		c.deposita(100); 
}

}

class ThreadRetira extends Thread {

private Conta c;

ThreadRetira(Conta c) { 
	this.c = c;
}

public void run() {
	for (int i = 0; i < 5; i++) // faz 5 retiradas de 50
		c.retira(50);    
}

}

class OperacoesBancarias {

public static void main(String[] args) {
	
	Conta c = new Conta();
	
	ThreadDeposita td = new ThreadDeposita(c);
	ThreadRetira   tr = new ThreadRetira(c);
	
	td.start();
	tr.start();
	
	System.out.println("Saldo da conta: " + c.saldo());
}

}

Tenta sincronizar o método saldo() também…

public synchronized float saldo() { return saldo; }

Responda se funcionou, por favor.

Continua o mesmo problema o saldo continua não dando certo as vezes da e as vezes não, mas na maioria das vezes ta dando 0 a vez de 750 e sincronizei o saldo e não adiantou

Eu estou estudando threads na faculdade mas nunca tinha usado com Java.

Coloquei para imprimir quem deposita e quem retira antes para ver, notei que a impressão println final não dependia dessas threads, então coloquei um

while( threads executando )
{ não faz nada}

Acho que resolvi teu problema, é para sempre imprimir 750, certo?

class Conta {

	private float saldo, valor;

	public Conta() {

	}

	public Conta(float inicial) {
		saldo = inicial;
	}

	public synchronized float saldo() {
		return saldo;
	}

	public synchronized void deposita(float valor) {
		saldo = saldo + valor;
	}

	public synchronized void retira(float valor) {
		saldo = saldo - valor;
	}

}

class ThreadDeposita extends Thread {

	private Conta c;

	ThreadDeposita(Conta c) {
		this.c = c;
	}

	public void run() {
		for (int i = 0; i < 10; i++)
			// faz 10 depositos de 100
			this.c.deposita(100);
		System.out.println("Deposita.");
	}

}

class ThreadRetira extends Thread {

	private Conta c;

	ThreadRetira(Conta c) {
		this.c = c;
	}

	public void run() {
		for (int i = 0; i < 5; i++)
			// faz 5 retiradas de 50
			this.c.retira(50);
		System.out.println("Retira.");
	}

}

class OperacoesBancarias {

	public static void main(String[] args) {

		Conta c = new Conta();

		ThreadDeposita td = new ThreadDeposita(c);
		ThreadRetira tr = new ThreadRetira(c);

		td.start();
		tr.start();
		
		//espera terminar as threads.
		while( td.isAlive() || tr.isAlive()) {
			//nada
		}

		System.out.println("Saldo da conta: " + c.saldo());
	}

}

Aguardo tua resposta.

agora funcionou muito obrigado

:lol: