Pessoal tenho o seguinte código abaixo:
public class Conta {
private int saldo = 50;
public int getSaldo(){
return saldo;
}
public void saque(int n){
saldo -= n;
}
}
public class Teste implements Runnable {
private Conta c = new Conta();
public void run() {
for (int i = 0; i < 5; i++) {
sacar(10);
}
}
public static void main(String[] args) {
Teste t = new Teste();
Thread one = new Thread(t);
Thread two = new Thread(t);
Thread three = new Thread(t);
one.setName("Joao");
two.setName("Maria");
three.setName("Pedro");
one.start();
two.start();
three.start();
}
private synchronized void sacar(int n) {
if (c.getSaldo() >= n) {
c.saque(n);
System.out.println(Thread.currentThread().getName() + " sacou: "
+ n + " reais " + "saldo em conta de: " + c.getSaldo()
+ " reais");
try {
Thread.sleep(500);
} catch (Exception e) {}
} else {
System.out.println("Sem saldo para o saque de "
+ Thread.currentThread().getName() + " Saldo: "
+ c.getSaldo() + " reais");
}
}
}
No livro da Kathy fala que a palavra reservada syncronized funciona como um bloqueio, e quando o Thread é suspenso ele mantém o bloqueio para que outros Threads não possam utilizar aquele método marcado como syncronized.
Só que testando esse código acima eu consegui a seguinte saída:
Joao sacou: 10 reais saldo em conta de: 40 reais
Joao sacou: 10 reais saldo em conta de: 30 reais
Maria sacou: 10 reais saldo em conta de: 20 reais
Maria sacou: 10 reais saldo em conta de: 10 reais
Maria sacou: 10 reais saldo em conta de: 0 reais
Sem saldo para o saque de Pedro Saldo: 0 reais
Sem saldo para o saque de Pedro Saldo: 0 reais
Sem saldo para o saque de Pedro Saldo: 0 reais
Sem saldo para o saque de Pedro Saldo: 0 reais
Sem saldo para o saque de Pedro Saldo: 0 reais
Sem saldo para o saque de Maria Saldo: 0 reais
Sem saldo para o saque de Maria Saldo: 0 reais
Sem saldo para o saque de Joao Saldo: 0 reais
Sem saldo para o saque de Joao Saldo: 0 reais
Sem saldo para o saque de Joao Saldo: 0 reais
A Maria pulou a vez do João antes que ele terminasse de sacar todo o dinheiro, existe alguma coisa errada?
Abraço
Editado:
Será que quando o João sai da suspensão o método é liberado novamente e o agendador decide quem executa ele primeiro?