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

Mais procurados

Exercícios da Aula de LAB 01
Exercícios da Aula de LAB 01Exercícios da Aula de LAB 01
Exercícios da Aula de LAB 01thomasdacosta
 
Algoritmos e Técnicas de Programação - Curso Completo
Algoritmos e Técnicas de Programação - Curso CompletoAlgoritmos e Técnicas de Programação - Curso Completo
Algoritmos e Técnicas de Programação - Curso Completothomasdacosta
 
Programação Estruturada 2 - Aula 01
Programação Estruturada 2 - Aula 01Programação Estruturada 2 - Aula 01
Programação Estruturada 2 - Aula 01thomasdacosta
 
Programação Estruturada 2 - Aula 01 - Código Fonte
Programação Estruturada 2 - Aula 01 - Código FonteProgramação Estruturada 2 - Aula 01 - Código Fonte
Programação Estruturada 2 - Aula 01 - Código Fontethomasdacosta
 
[Curso Java Basico - Exceptions] Aula 52: criando sua propria exception
[Curso Java Basico - Exceptions] Aula 52: criando sua propria exception[Curso Java Basico - Exceptions] Aula 52: criando sua propria exception
[Curso Java Basico - Exceptions] Aula 52: criando sua propria exceptionLoiane Groner
 
LAB 01 - Programação Estruturada 2
LAB 01 - Programação Estruturada 2LAB 01 - Programação Estruturada 2
LAB 01 - Programação Estruturada 2thomasdacosta
 
Algoritmos e Técnicas de Programação - Aula 03
Algoritmos e Técnicas de Programação - Aula 03Algoritmos e Técnicas de Programação - Aula 03
Algoritmos e Técnicas de Programação - Aula 03thomasdacosta
 
Algoritmos e Técnicas de Programação - Aula 06
Algoritmos e Técnicas de Programação - Aula 06Algoritmos e Técnicas de Programação - Aula 06
Algoritmos e Técnicas de Programação - Aula 06thomasdacosta
 
Algoritmos e Estrutura de Dados - Aula 02
Algoritmos e Estrutura de Dados - Aula 02Algoritmos e Estrutura de Dados - Aula 02
Algoritmos e Estrutura de Dados - Aula 02thomasdacosta
 
Aula c++ estruturas de dados
Aula c++   estruturas de dadosAula c++   estruturas de dados
Aula c++ estruturas de dadosJean Martina
 
4º Aula do Grupo de estudos sobre funções
4º Aula do Grupo de estudos sobre funções4º Aula do Grupo de estudos sobre funções
4º Aula do Grupo de estudos sobre funçõesFellyph Cintra
 
Exercícios da Aula de LAB 03
Exercícios da Aula de LAB 03Exercícios da Aula de LAB 03
Exercícios da Aula de LAB 03thomasdacosta
 
[Curso Java Basico] Aula 60: Escopo de Variaveis
[Curso Java Basico] Aula 60: Escopo de Variaveis[Curso Java Basico] Aula 60: Escopo de Variaveis
[Curso Java Basico] Aula 60: Escopo de VariaveisLoiane Groner
 
Lógica e Matemática Computacional - Aula 04
Lógica e Matemática Computacional - Aula 04Lógica e Matemática Computacional - Aula 04
Lógica e Matemática Computacional - Aula 04thomasdacosta
 
Algoritmos e Estrutura de Dados - Aula 05
Algoritmos e Estrutura de Dados - Aula 05Algoritmos e Estrutura de Dados - Aula 05
Algoritmos e Estrutura de Dados - Aula 05thomasdacosta
 
Desenvolvimento de Software
Desenvolvimento de SoftwareDesenvolvimento de Software
Desenvolvimento de SoftwareVagner Santana
 

Mais procurados (20)

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

Destaque

Programação Concorrente - Curso Completo
Programação Concorrente - Curso CompletoProgramação Concorrente - Curso Completo
Programação Concorrente - Curso Completothomasdacosta
 
Programação Concorrente - Aula 01
Programação Concorrente - Aula 01Programação Concorrente - Aula 01
Programação Concorrente - Aula 01thomasdacosta
 
Programação de Sistemas Distribuídos - Aula 02
Programação de Sistemas Distribuídos - Aula 02Programação de Sistemas Distribuídos - Aula 02
Programação de Sistemas Distribuídos - Aula 02thomasdacosta
 
Programação de Sistemas Distribuídos - Aula 03
Programação de Sistemas Distribuídos - Aula 03Programação de Sistemas Distribuídos - Aula 03
Programação de Sistemas Distribuídos - Aula 03thomasdacosta
 
Programação Concorrente - Aula 06
Programação Concorrente - Aula 06Programação Concorrente - Aula 06
Programação Concorrente - Aula 06thomasdacosta
 
Programação Concorrente - Aula 07
Programação Concorrente - Aula 07Programação Concorrente - Aula 07
Programação Concorrente - Aula 07thomasdacosta
 
Programação de Sistemas Distribuídos - Aula 01
Programação de Sistemas Distribuídos - Aula 01Programação de Sistemas Distribuídos - Aula 01
Programação de Sistemas Distribuídos - Aula 01thomasdacosta
 
Programação Concorrente - LAB 01
Programação Concorrente - LAB 01Programação Concorrente - LAB 01
Programação Concorrente - LAB 01thomasdacosta
 
Programação Estruturada 2 - Aula 05 - Código Fonte
Programação Estruturada 2 - Aula 05 - Código FonteProgramação Estruturada 2 - Aula 05 - Código Fonte
Programação Estruturada 2 - Aula 05 - Código Fontethomasdacosta
 
Algoritmos e Técnicas de Programação - Aula 02
Algoritmos e Técnicas de Programação - Aula 02Algoritmos e Técnicas de Programação - Aula 02
Algoritmos e Técnicas de Programação - Aula 02thomasdacosta
 
Redes de Computadores - Exercícios 03
Redes de Computadores - Exercícios 03Redes de Computadores - Exercícios 03
Redes de Computadores - Exercícios 03thomasdacosta
 
Organização de Computadores - Aula 02
Organização de Computadores - Aula 02Organização de Computadores - Aula 02
Organização de Computadores - Aula 02thomasdacosta
 
Redes de Computadores - Aula 05
Redes de Computadores - Aula 05Redes de Computadores - Aula 05
Redes de Computadores - Aula 05thomasdacosta
 
Algoritmos e Técnicas de Programação - Aula 01
Algoritmos e Técnicas de Programação - Aula 01Algoritmos e Técnicas de Programação - Aula 01
Algoritmos e Técnicas de Programação - Aula 01thomasdacosta
 

Destaque (14)

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

Semelhante a Programação Concorrente - Aula 04

Mini-curso Programação Paralela e Distribuída
Mini-curso Programação Paralela e DistribuídaMini-curso Programação Paralela e Distribuída
Mini-curso Programação Paralela e DistribuídaDeivid Martins
 
Aula 03 estrutura de seleção
Aula 03   estrutura de seleçãoAula 03   estrutura de seleção
Aula 03 estrutura de seleçãoTácito Graça
 
Estrutura de Dados - Aula 04
Estrutura de Dados - Aula 04Estrutura de Dados - Aula 04
Estrutura de Dados - Aula 04thomasdacosta
 
TDC2013 Otimizando-C
TDC2013 Otimizando-CTDC2013 Otimizando-C
TDC2013 Otimizando-Cosmarcf
 
Java - Introdução a banco de dados
Java - Introdução a banco de dadosJava - Introdução a banco de dados
Java - Introdução a banco de dadosSérgio Souza Costa
 
Estrutura de linguagem C++
Estrutura de linguagem C++Estrutura de linguagem C++
Estrutura de linguagem C++Verônica Veiga
 
Tutorial dev cpp 002 - criação, leitura e alteração de arquivos
Tutorial dev cpp   002 - criação, leitura e alteração de arquivosTutorial dev cpp   002 - criação, leitura e alteração de arquivos
Tutorial dev cpp 002 - criação, leitura e alteração de arquivosFlávio Freitas
 
Como conectar programas em linguagem java a bases de dados
Como conectar programas em linguagem java  a bases de dadosComo conectar programas em linguagem java  a bases de dados
Como conectar programas em linguagem java a bases de dadosHenrique Fernandes
 
Webinar: Porque o RTOS não faz o que eu quero?
Webinar: Porque o RTOS não faz o que eu quero?Webinar: Porque o RTOS não faz o que eu quero?
Webinar: Porque o RTOS não faz o que eu quero?Embarcados
 
[CLPE] Design patterns com c#
[CLPE] Design patterns com c#[CLPE] Design patterns com c#
[CLPE] Design patterns com c#Felipe Pimentel
 
Domain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BHDomain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BHGiovanni Bassi
 

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

Mini-curso Programação Paralela e Distribuída
Mini-curso Programação Paralela e DistribuídaMini-curso Programação Paralela e Distribuída
Mini-curso Programação Paralela e Distribuída
 
Aula 03 estrutura de seleção
Aula 03   estrutura de seleçãoAula 03   estrutura de seleção
Aula 03 estrutura de seleção
 
Estrutura de Dados - Aula 04
Estrutura de Dados - Aula 04Estrutura de Dados - Aula 04
Estrutura de Dados - Aula 04
 
TDC2013 Otimizando-C
TDC2013 Otimizando-CTDC2013 Otimizando-C
TDC2013 Otimizando-C
 
Curso de java 02
Curso de java 02Curso de java 02
Curso de java 02
 
Java - Introdução a banco de dados
Java - Introdução a banco de dadosJava - Introdução a banco de dados
Java - Introdução a banco de dados
 
Series lab
Series labSeries lab
Series lab
 
Threads 09: Paralelismo
Threads 09: ParalelismoThreads 09: Paralelismo
Threads 09: Paralelismo
 
Estrutura de linguagem C++
Estrutura de linguagem C++Estrutura de linguagem C++
Estrutura de linguagem C++
 
threads e-sockets-em-java
 threads e-sockets-em-java threads e-sockets-em-java
threads e-sockets-em-java
 
Apostila aed
Apostila aedApostila aed
Apostila aed
 
Parte1c
Parte1cParte1c
Parte1c
 
Tutorial dev cpp 002 - criação, leitura e alteração de arquivos
Tutorial dev cpp   002 - criação, leitura e alteração de arquivosTutorial dev cpp   002 - criação, leitura e alteração de arquivos
Tutorial dev cpp 002 - criação, leitura e alteração de arquivos
 
Como conectar programas em linguagem java a bases de dados
Como conectar programas em linguagem java  a bases de dadosComo conectar programas em linguagem java  a bases de dados
Como conectar programas em linguagem java a bases de dados
 
Webinar: Porque o RTOS não faz o que eu quero?
Webinar: Porque o RTOS não faz o que eu quero?Webinar: Porque o RTOS não faz o que eu quero?
Webinar: Porque o RTOS não faz o que eu quero?
 
Mock Objects
Mock ObjectsMock Objects
Mock Objects
 
[CLPE] Design patterns com c#
[CLPE] Design patterns com c#[CLPE] Design patterns com c#
[CLPE] Design patterns com c#
 
Domain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BHDomain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BH
 
Threads e sockets java
Threads e sockets javaThreads e sockets java
Threads e sockets java
 
Ganhando tempo com casos de testes
Ganhando tempo com casos de testesGanhando tempo com casos de testes
Ganhando tempo com casos de testes
 

Mais de thomasdacosta

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

Mais de thomasdacosta (11)

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

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