Controle de Concorrência
Unidade 3
Se bem utilizado, o paralelismo resulta em utilizado, um melhor desempenho dos programas
Controle de Concorrência
Mais threads
No entanto, podem ocorrer problemas no entanto, acesso concorrente a dados e recursos
Monitores
Locks
Semáforos
Concorrência na API Java
Dados podem se tornar inconsistentes ao serem acessados concorrentemente
(ex.: duas pessoas editando o mesmo arquivo) arquivo) Alguns recursos não podem ser compartilhados
(ex.: dois programas usando a impressora) impressora) Controle de Concorrência
Controle de Concorrência
Exemplo:
Exemplo:
Suponha que X é um dado compartilhado, compartilhado, com valor inicial 0
P1
...
X=X+1
...
P2
...
X=X+2
...
Exemplo: Conta Bancária public class Conta { public double saldo = 0; public Conta(double saldo) { this.saldo = saldo;
System.out.println("Conta criada. Saldo inicial: R$" + saldo);
}
P3
...
X=X+3
...
public double getSaldo() { return saldo;
}
Qual o valor final de X?
Assembly:
Load X
Add 1
Store X
Load X
Add 2
Store X
Load X
Add 3
Store X
}
Controle de Concorrência
public void setSaldo(double saldo) { this.saldo = saldo;
}
Controle de Concorrência
Exemplo: Classe Banco public class Banco {
}
processador melhor utilizado
Exemplo: Clientes do Banco public class Cliente extends Thread {
public boolean saque(Conta conta, double valor) { double saldo = conta.getSaldo(); if (saldo < valor) {
System.out.println("Saldo insuficiente para o saque."); return false;
}
double novoSaldo = saldo - valor;
System.out.println(Thread.currentThread().getName() +
" sacou R$"+valor+". Saldo após saque: R$"+novoSaldo); conta.setSaldo(novoSaldo); return true;
}
private static Banco banco = new Banco(); private Conta conta = null; private double valor = 100; public Cliente(String nome, Conta conta) { super(nome); this.conta = conta;
}
}
public void run()