17
ANHANGUERA – 2016.1 PROGRAMAÇÃO CONCORRENTE AULA 04 – SINCRONIZAÇÃO Prof. Thomás da Costa [email protected]

Programação Concorrente - Aula 04

Embed Size (px)

Citation preview

Page 1: Programação Concorrente - Aula 04

ANHANGUERA – 2016.1

PROGRAMAÇÃO CONCORRENTEAULA 04 – SINCRONIZAÇÃO

Prof. Thomás da [email protected]

Page 2: Programação Concorrente - Aula 04

PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa

SINCRONIZAÇÃO

SINCRONIZAÇÃO

Page 3: Programação Concorrente - Aula 04

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

Page 4: Programação Concorrente - Aula 04

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.

Page 5: Programação Concorrente - Aula 04

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();

} }

Page 6: Programação Concorrente - Aula 04

PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa

SINCRONIZAÇÃO

Resultado final incorreto. Deveria efetuar a contagem corretamente.

Page 7: Programação Concorrente - Aula 04

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();

} }

Page 8: Programação Concorrente - Aula 04

PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa

SINCRONIZAÇÃO

Contagem efetuada com sucesso. Valor final correto !!!

Page 9: Programação Concorrente - Aula 04

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.

Page 10: Programação Concorrente - Aula 04

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.

Page 11: Programação Concorrente - Aula 04

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;

} }

Page 12: Programação Concorrente - Aula 04

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();

}  } 

Page 13: Programação Concorrente - Aula 04

PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa

SINCRONIZAÇÃO

Valor incorreto na conta corrente.

Page 14: Programação Concorrente - Aula 04

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();

} }

Page 15: Programação Concorrente - Aula 04

PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa

SINCRONIZAÇÃO

Saldo correto !!

Page 16: Programação Concorrente - Aula 04

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

Page 17: Programação Concorrente - Aula 04

Obrigado !!!

ANHANGUERA – 2016.1