3. PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
Sincronização
Detalhes:
• Em alguns programas, as threads utilizam informações compartilhadas.
• As informações compartilhadas, normalmente são variáveis que possuem
algum valor.
• Pode ser também algum trecho de código que modifica alguma informação
em varias variáveis ou em um local de armazenamento como um banco de
dados.
• Por exemplo:
• Em uma conta corrente temos o valor do saldo.
• Normalmente quando ocorre o saque ou um depósito o valor final deve
permanecer correto.
• Algumas vezes o saque e o depósito ocorrem ao mesmo tempo.
• Se esse processo acontecer em threads separadas, podemos ter o valor
final alterado incorretamente.
SINCRONIZAÇÃO
4. PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
Sincronização
Detalhes:
• Para trabalhar com dados compartilhados e manter a sua integridade,
utilizamos um conceito conhecido como sincronização.
• Duas threads utilizam da mesma informação mas cada uma espera a
execução de outra thread ser concluída.
SINCRONIZAÇÃO
Vamos ver um exemplo sem
sincronização das informações.
5. PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
package edu.anhanguera.prc.aula04;
public class Sincronizacao01 extends Thread {
public static int contador = 0;
public void run() {
for (int i=1;i<=10;i++)
incrementarContador();
}
public void incrementarContador() {
contador++;
System.out.println(this.getName() + " - " + contador);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {}
}
public static void main(String[] args) throws InterruptedException {
Sincronizacao01 sinc1 = new Sincronizacao01();
Thread thread1 = new Thread(sinc1);
thread1.start();
Thread thread2 = new Thread(sinc1);
thread2.start();
}
}
6. PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
SINCRONIZAÇÃO
Resultado final incorreto. Deveria
efetuar a contagem corretamente.
7. PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
package edu.anhanguera.prc.aula04;
public class Sincronizacao02 extends Thread {
public static int contador = 0;
public void run() {
synchronized (this) {
for (int i=1;i<=10;i++)
incrementarContador();
}
}
public void incrementarContador() {
contador++;
System.out.println(this.getName() + " - " + contador);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {}
}
public static void main(String[] args) throws InterruptedException {
Sincronizacao02 sinc1 = new Sincronizacao02();
Thread thread1 = new Thread(sinc1);
thread1.start();
Thread thread2 = new Thread(sinc1);
thread2.start();
}
}
8. PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
SINCRONIZAÇÃO
Contagem efetuada com sucesso.
Valor final correto !!!
9. PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
Sincronização
Detalhes:
SINCRONIZAÇÃO
• Foi utilizada a palavra reservada synchronized em um bloco de código.
• Esta palavra efetua a sincronização de um método ou bloco de código.
10. PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
Sincronização
Outro exemplo:
SINCRONIZAÇÃO
• Vamos ver um exemplo utilizando a lógica de uma conta corrente de um
banco.
• Vamos demonstrar um programa efetuando vários depósitos em uma conta
corrente.
11. PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
package edu.anhanguera.prc.aula04;
public class ContaCorrente {
public double saldo;
public ContaCorrente() {
}
public void sacar(double valor) {
if ((saldo-valor) <= 0) {
System.out.println("Saldo indisponivel: " + saldo);
}
saldo -= valor;
}
public void depositar(double valor) {
saldo += valor;
}
}
12. PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
package edu.anhanguera.prc.aula04;
public class BancoNaoSincronizado implements Runnable {
public ContaCorrente contaCorrente;
public void run() {
for (int i=10;i<=100;i+=10) {
contaCorrente.depositar(i);
System.out.println("Saldo Atual:" + contaCorrente.saldo);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
ContaCorrente contaCorrente = new ContaCorrente();
BancoNaoSincronizado banco = new BancoNaoSincronizado();
banco.contaCorrente = contaCorrente;
Thread thread1 = new Thread(banco);
thread1.start();
Thread thread2 = new Thread(banco);
thread2.start();
Thread thread3 = new Thread(banco);
thread3.start();
}
}
16. PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
Resumo
• Uma thread pode utilizar informações compartilhadas.
• Caso essas informações sejam sensíveis, alguns valores serão computados
incorretamente.
• Para resolver este problema utilizamos a sincronização.
• Utilizamos a palavra reservada synchronized para resolver o problema de
sincronização.
SINCRONIZAÇÃO