SlideShare uma empresa Scribd logo
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

Mais conteúdo relacionado

PPTX
Programação Concorrente - Aula 05
PPTX
Programação Concorrente - Aula 02
PPTX
Algoritmos e Técnicas de Programação - Aula 04
PPTX
Algoritmos e Estrutura de Dados - Aula 04
PPTX
Algoritmos e Estrutura de Dados - Aula 03
PPTX
Programação Concorrente - Aula 03
PPTX
Linguagem de Programação Java
PDF
Programação Estruturada 2 - Curso Completo
Programação Concorrente - Aula 05
Programação Concorrente - Aula 02
Algoritmos e Técnicas de Programação - Aula 04
Algoritmos e Estrutura de Dados - Aula 04
Algoritmos e Estrutura de Dados - Aula 03
Programação Concorrente - Aula 03
Linguagem de Programação Java
Programação Estruturada 2 - Curso Completo

Mais procurados (20)

DOCX
Exercícios da Aula de LAB 01
PPTX
Algoritmos e Técnicas de Programação - Curso Completo
PPTX
Programação Estruturada 2 - Aula 01
PPTX
Java hidden features
DOCX
Programação Estruturada 2 - Aula 01 - Código Fonte
PDF
[Curso Java Basico - Exceptions] Aula 52: criando sua propria exception
PPTX
Java hidden features
PPTX
LAB 01 - Programação Estruturada 2
DOCX
Java para iniciantes
PPTX
Algoritmos e Técnicas de Programação - Aula 03
PPTX
Algoritmos e Técnicas de Programação - Aula 06
PPTX
Algoritmos e Estrutura de Dados - Aula 02
ODP
Aula c++ estruturas de dados
PPT
4º Aula do Grupo de estudos sobre funções
PDF
Exercícios da Aula de LAB 03
PDF
[Curso Java Basico] Aula 60: Escopo de Variaveis
PPTX
Lógica e Matemática Computacional - Aula 04
PPTX
Algoritmos e Estrutura de Dados - Aula 05
PPTX
Depuração de software
PPT
Desenvolvimento de Software
Exercícios da Aula de LAB 01
Algoritmos e Técnicas de Programação - Curso Completo
Programação Estruturada 2 - Aula 01
Java hidden features
Programação Estruturada 2 - Aula 01 - Código Fonte
[Curso Java Basico - Exceptions] Aula 52: criando sua propria exception
Java hidden features
LAB 01 - Programação Estruturada 2
Java para iniciantes
Algoritmos e Técnicas de Programação - Aula 03
Algoritmos e Técnicas de Programação - Aula 06
Algoritmos e Estrutura de Dados - Aula 02
Aula c++ estruturas de dados
4º Aula do Grupo de estudos sobre funções
Exercícios da Aula de LAB 03
[Curso Java Basico] Aula 60: Escopo de Variaveis
Lógica e Matemática Computacional - Aula 04
Algoritmos e Estrutura de Dados - Aula 05
Depuração de software
Desenvolvimento de Software
Anúncio

Destaque (14)

PPTX
Programação Concorrente - Curso Completo
PPTX
Programação Concorrente - Aula 01
PPTX
Programação de Sistemas Distribuídos - Aula 02
PPTX
Programação de Sistemas Distribuídos - Aula 03
PPTX
Programação Concorrente - Aula 06
PPTX
Programação Concorrente - Aula 07
PPTX
Programação de Sistemas Distribuídos - Aula 01
PPTX
Programação Concorrente - LAB 01
DOCX
Programação Estruturada 2 - Aula 05 - Código Fonte
PPTX
Algoritmos e Técnicas de Programação - Aula 02
PPTX
Redes de Computadores - Exercícios 03
PPTX
Organização de Computadores - Aula 02
PPTX
Redes de Computadores - Aula 05
PPTX
Algoritmos e Técnicas de Programação - Aula 01
Programação Concorrente - Curso Completo
Programação Concorrente - Aula 01
Programação de Sistemas Distribuídos - Aula 02
Programação de Sistemas Distribuídos - Aula 03
Programação Concorrente - Aula 06
Programação Concorrente - Aula 07
Programação de Sistemas Distribuídos - Aula 01
Programação Concorrente - LAB 01
Programação Estruturada 2 - Aula 05 - Código Fonte
Algoritmos e Técnicas de Programação - Aula 02
Redes de Computadores - Exercícios 03
Organização de Computadores - Aula 02
Redes de Computadores - Aula 05
Algoritmos e Técnicas de Programação - Aula 01
Anúncio

Semelhante a Programação Concorrente - Aula 04 (20)

PDF
Mini-curso Programação Paralela e Distribuída
PDF
Aula 03 estrutura de seleção
PPTX
Curso de Java 12 - (JDBC, Transation, Commit e Rollback).pptx
PPTX
Estrutura de Dados - Aula 04
PDF
TDC2013 Otimizando-C
PDF
Curso de java 02
PPTX
Curso de Java 9 - (Threads) Multitarefas.pptx
PDF
Java - Introdução a banco de dados
PDF
Threads 09: Paralelismo
PDF
Estrutura de linguagem C++
PDF
threads e-sockets-em-java
PDF
Apostila aed
PDF
Tutorial dev cpp 002 - criação, leitura e alteração de arquivos
PDF
Como conectar programas em linguagem java a bases de dados
PDF
Webinar: Porque o RTOS não faz o que eu quero?
PPT
Mock Objects
PPT
[CLPE] Design patterns com c#
PPT
Domain Driven Design (DDD) - DevIsland, BH
Mini-curso Programação Paralela e Distribuída
Aula 03 estrutura de seleção
Curso de Java 12 - (JDBC, Transation, Commit e Rollback).pptx
Estrutura de Dados - Aula 04
TDC2013 Otimizando-C
Curso de java 02
Curso de Java 9 - (Threads) Multitarefas.pptx
Java - Introdução a banco de dados
Threads 09: Paralelismo
Estrutura de linguagem C++
threads e-sockets-em-java
Apostila aed
Tutorial dev cpp 002 - criação, leitura e alteração de arquivos
Como conectar programas em linguagem java a bases de dados
Webinar: Porque o RTOS não faz o que eu quero?
Mock Objects
[CLPE] Design patterns com c#
Domain Driven Design (DDD) - DevIsland, BH

Mais de thomasdacosta (11)

PPTX
Azure Functions e Java: Do Desenvolvimento a Produção
PPTX
Organização de Computadores - Aula 03
PPTX
Organização de Computadores - Aula 01
PPTX
Redes de Computadores - Exercícios 06
PPTX
Redes de Computadores - Exercícios 05
PPTX
Redes de Computadores - Exercícios 04
PPTX
Redes de Computadores - Aula 04
PPTX
Redes de Computadores - Aula 03
PPTX
Redes de Computadores - Aula 02
PPTX
Algoritmos e Estrutura de Dados - Aula 01
PPTX
Redes de Computadores - Aula 01
Azure Functions e Java: Do Desenvolvimento a Produção
Organização de Computadores - Aula 03
Organização de Computadores - Aula 01
Redes de Computadores - Exercícios 06
Redes de Computadores - Exercícios 05
Redes de Computadores - Exercícios 04
Redes de Computadores - Aula 04
Redes de Computadores - Aula 03
Redes de Computadores - Aula 02
Algoritmos e Estrutura de Dados - Aula 01
Redes de Computadores - Aula 01

Último (11)

PDF
Jira Software projetos completos com scrum
PPTX
Informática Aplicada Informática Aplicada Plano de Ensino - estudo de caso NR...
PPTX
Tipos de servidor em redes de computador.pptx
PDF
Manejo integrado de pragas na cultura do algodão
PDF
eBook - GUIA DE CONSULTA RAPIDA EM ROTEADORES E SWITCHES CISCO - VOL I.pdf
PDF
Termos utilizados na designação de relação entre pessoa e uma obra.pdf
PPTX
Eng. Software - pontos essenciais para o início
PPT
Conceitos básicos de Redes Neurais Artificiais
PPTX
Utilizando code blockes por andre backes
PPTX
Proposta de Implementação de uma Rede de Computador Cabeada.pptx
PPTX
Viasol Energia Solar -Soluções para geração e economia de energia
Jira Software projetos completos com scrum
Informática Aplicada Informática Aplicada Plano de Ensino - estudo de caso NR...
Tipos de servidor em redes de computador.pptx
Manejo integrado de pragas na cultura do algodão
eBook - GUIA DE CONSULTA RAPIDA EM ROTEADORES E SWITCHES CISCO - VOL I.pdf
Termos utilizados na designação de relação entre pessoa e uma obra.pdf
Eng. Software - pontos essenciais para o início
Conceitos básicos de Redes Neurais Artificiais
Utilizando code blockes por andre backes
Proposta de Implementação de uma Rede de Computador Cabeada.pptx
Viasol Energia Solar -Soluções para geração e economia de energia

Programação Concorrente - Aula 04

  • 1. ANHANGUERA – 2016.1 PROGRAMAÇÃO CONCORRENTE 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