ANHANGUERA – 2016.1
PROGRAMAÇÃO CONCORRENTE
AULA 04 – SINCRONIZAÇÃO
Prof. Thomás da Costa
thomascosta@aedu.com
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
SINCRONIZAÇÃO
SINCRONIZAÇÃO
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
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.
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çã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.
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.
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

Programação Concorrente - Aula 04

  • 1.
    ANHANGUERA – 2016.1 PROGRAMAÇÃOCONCORRENTE AULA 04 – SINCRONIZAÇÃO Prof. Thomás da Costa thomascosta@aedu.com
  • 2.
    PROGRAMAÇÃO CONCORRENTE –Prof. Thomás da Costa SINCRONIZAÇÃO SINCRONIZAÇÃO
  • 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(); } }
  • 13.
    PROGRAMAÇÃO CONCORRENTE –Prof. Thomás da Costa SINCRONIZAÇÃO Valor incorreto na conta corrente.
  • 14.
    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(); } }
  • 15.
    PROGRAMAÇÃO CONCORRENTE –Prof. Thomás da Costa SINCRONIZAÇÃO Saldo correto !!
  • 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
  • 17.