programação concorrente - aula 04
TRANSCRIPT
ANHANGUERA – 2016.1
PROGRAMAÇÃO CONCORRENTEAULA 04 – SINCRONIZAÇÃO
Prof. Thomás da [email protected]
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
SINCRONIZAÇÃO
SINCRONIZAÇÃO
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
SincronizaçãoDetalhes:• 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
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
SincronizaçãoDetalhes:• 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.
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();
} }
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
SINCRONIZAÇÃO
Resultado final incorreto. Deveria efetuar a contagem corretamente.
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();
} }
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
SINCRONIZAÇÃO
Contagem efetuada com sucesso. Valor final correto !!!
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
SincronizaçãoDetalhes:
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.
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
SincronizaçãoOutro 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.
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;
} }
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();
} }
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
SINCRONIZAÇÃO
Valor incorreto na conta corrente.
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
package edu.anhanguera.prc.aula04; public class BancoSincronizado implements Runnable {
public ContaCorrente contaCorrente;
public void run() {synchronized (contaCorrente) {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();
BancoSincronizado banco = new BancoSincronizado();banco.contaCorrente = contaCorrente;
Thread thread1 = new Thread(banco);thread1.start();
Thread thread2 = new Thread(banco);thread2.start();
Thread thread3 = new Thread(banco);thread3.start();
} }
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
SINCRONIZAÇÃO
Saldo correto !!
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
Obrigado !!!
ANHANGUERA – 2016.1