Sincronização de Threads

Slides:



Advertisements
Apresentações semelhantes
Programação em Java Prof. Maurício Braga
Advertisements

Programação em Java Prof. Maurício Braga
SISTEMAS OPERACIONAIS (SO) Aula 5 Luciana A. F. Martimiano 2002
Estruturas de Repetição
Collections Marco Antonio, Arquiteto de Software – TJDF Atualizado Dezembro/2008.
Métodos, Parâmetros, Argumentos e Contratos
Introdução à Programação usando Processing Programação Gráfica 2D Animações Exercício Animações 14/10/09 Bruno C. de Paula 2º Semestre 2009 > PUCPR >
14/10/09 Uma animação possui: Início; Passo; Fim; 1.
Interação entre objetos
Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 3.
Projeto de Sistemas de Software Trabalho de Padrões de Projeto
Orientação a Objetos: Encapsulamento e Classificação
Java: Pacotes e Modificadores de Visibilidade
Java: Pacotes e Modificadores de Visibilidade
Conceitos de Programação Paralela - 2
Chapter 4: Threads.
Universidade de São Paulo Instituto de Ciências Matemáticas e de Computação Departamento de Sistemas de Computação SSC SISTEMAS OPERACIONAIS I Turmas.
Walfredo Cirne walfredo.dsc.ufpb.br
Walfredo Cirne Threads Walfredo Cirne
Programação Concorrente
Sincronização de Processos (3)
9 Controle de fluxo Seqüenciadores. Jumps. Escapes. Exceções.
Sincronização e Comunicação entre Processos
Capítulo 9 Herança 1.
Programação Baseada em Objectos Desenho de TAD
Listas Encadeadas.
Classes e objetos Arrays e Sobrecarga
Estrutura de decisão e repetição em JAVA
Herança P. O. O. Prof. Ângela e Grace.
Classes e objetos P. O. O. Prof. Grace.
Sistemas Operacionais
Threads sem Sincronização
Concorrência em Java Threads em Java.
Threads: Introdução e Implementação
Professor: Hyggo Almeida
Controle de Concorrência
Monitores.
Locks.
Concorrência em Java Threads em Java.
Concorrência em Java Threads em Java.
Infra-Estrutura de Comunicação (IF678)
Singleton e Adapter Professor: Nazareno Andrade
Entendendo as definições de classe
Projeto de Banco de Dados
1 2 Observa ilustração. Cria um texto. Observa ilustração.
Os métodos equals() e hashCode()
Introdução à Programação Orientada a Objetos com Java Paulo Borba Centro de Informática Universidade Federal de Pernambuco Conceitos Básicos de Concorrência.
CALENDÁRIO SEXY Ele & Ela. CALENDÁRIO SEXY Ele & Ela.
Programação Orientada a Objetos - Java Professor: Jean Carlo Mendes.
Concorrência e thread Petrônio Júnior(pglj) Márcio Neves(mmn2)
Listas Simplesmente Encadeadas
Wagner Santos C. de Jesus
Semáforos J2SE 5.0 Estudo da API e comparação com definição clássica Gustavo Frainer Rômulo Rosinha
Tratamento de Exceções
Programação com Threads
Transações Concorrentes
Paulo Borba e Augusto Sampaio Centro de Informática Universidade Federal de Pernambuco Especificação de Sistemas Distribuídos.
Coleções, Genéricos, Threads Marco Antonio. Collection Principais métodos da interface Collection.
Sistemas Concorrentes Capítulo 02 – Threads
Coleções em Java - Parte 2
Sistemas Distribuídos Aula 05 – Programação Multithread/Paralela
Aula prática de Concorrência Equipe de Monitoria: Bruno Pereira - bpe Davi Pires - dpr Guilherme Barros – gbs2 Thiago Cavalcanti - trc.
Video Capítulo 7: Sincronização de Processos. Silberschatz, Galvin and Gagne  Video Operating System Concepts Assuntos n Cenário n O problema.
Métodos e Classes para Sincronização no JDK 5.0 Vitor Hugo Becker
Java Threads.
Capítulo 8 Threads.
CURSO JAVA BÁSICO Módulo 9 – slide 1 Módulo 10 Threads.
ProgramaçãoConcorrente Glêdson Elias
Arleys Pereira Nunes de Castro - Mestrando : Modelagem computacional (SENAI-MCTI) Especialista : Sistema distribuídos
ProgramaçãoConcorrente Glêdson Elias
Transcrição da apresentação:

Sincronização de Threads Professor: Hyggo Almeida Laboratório de Sistemas Embarcados e Computação Pervasiva Centro de Engenharia Elétrica e Informática Universidade Federal de Campina Grande

O que vimos na última aula? Threads Ciclo de vida Escalonamento Sincronização de Threads

O que veremos hoje? Threads Sincronização Sincronização de Threads

Sincronização de Threads As threads vistas até agora são executadas paralelamente Mas não há recursos compartilhados Elas são independentes Não se concorre por recursos... ...não há concorrência!!! Sincronização de Threads

Sincronização de Threads Produtor/Consumidor Um produtor gera um número entre 0 e 9 e o armazena em uma instância de SharedResource O produtor dorme durante um intervalo aleatório de 0 a 100 ms antes de gerar mais números O consumidor consome os números inteiros acessando a mesma instância de SharedResource Sincronização de Threads

Sincronização de Threads Produtor public class Producer extends Thread { private SharedResource resource; private int number; public Producer(SharedResource c, int number) { resource = c; this.number = number; } public void run() { for (int i = 0; i < 10; i++) { resource.put(i); try { sleep((int)(Math.random() * 100)); } catch (InterruptedException e) { } Sincronização de Threads

Sincronização de Threads Produtor public class Consumer extends Thread { private SharedResource resource; private int number; public Consumer(SharedResource c, int number) { resource = c; this.number = number; } public void run() { int value = 0; for (int i = 0; i < 10; i++) { value = resource.get(); Sincronização de Threads

Sincronização de Threads Produtor/Consumidor O produtor e o consumidor compartilham dados da instância de SharedResource O consumidor deve receber um dado número apenas uma vez... ... mas quem está controlando isso? Sincronização de Threads

Sincronização de Threads Produtor/Consumidor Uma vez que não há sincronização na execução das threads, pode-se ter duas situações indesejadas: O consumidor perde um número... caso o produtor produza mais rápido um novo número antes que seja consumido... O consumidor consome números repetidos... caso o produtor não produza um novo número a tempo Esse tipo de problema é denominado condição de corrida Sincronização de Threads

Sincronização de Threads Condição de corrida Quando duas ou mais threads ou processos compartilham dados e o resultado final depende do escalonamento As atividades do produtor e do consumidor devem ser sincronizadas em dois passos... Travando o objeto (locking), impedindo que duas threads o acessem ao simultaneamente Fazer com que cada thread coordene seu trabalho, notificando a outra thread quando o número foi produzido e consumido Sincronização de Threads

Sincronização de Threads Sincronização via locking Trechos do código que possuem estruturas de dados acessadas por threads diferentes e concorrentes são chamados regiões ou seções críticas Uma região crítica é demarcada pela palavra synchronized public class SharedResource { private int contents; private boolean available = false; public synchronized int get() { ... } public synchronized void put(int value) { Sincronização de Threads

Sincronização de Threads Sincronização via locking Bloco “avulso” de código //.. synchronized { //qualquer trecho de código } //.. synchronized (obj){ //qualquer trecho de código } Sincronização de Threads

Sincronização de Threads Sincronização via locking Locking reentrante public class Reentrant { public synchronized void a() { b(); System.out.println(“Estou em a()”); } public synchronized void b() { System.out.println(“Estou em b()”); Sincronização de Threads

Sincronização de Threads Sincronização via wait e notifyAll public synchronized int get() { while (available == false) { try { //esperar o produtor avisar que produziu wait(); } catch (InterruptedException e) { } } available = false; //notificar produtor de que o valor foi recuperado notifyAll(); return contents; Sincronização de Threads

Sincronização de Threads Sincronização via wait e notifyAll public synchronized void put(int value) { while (available == true) { try { //Esperar aviso do consumidor de que recuperou número wait(); } catch (InterruptedException e) { } } contents = value; available = true; //Notificar consumidor de que número foi produzido notifyAll(); Sincronização de Threads

Sincronização de Threads Sincronização via wait e notifyAll O método wait libera o lock e espera notificação para continuar Para que outra thread possa adquirir o lock, fazer seu trabalho e então “acordar” a original (com notifyAll) Ao acordar, tem-se o lock novamente O método notifyAll “acorda” todas as threads que estão em wait (nesse objeto) As threads que acordam competem pelo lock Quando uma thread tem o lock, as outras dormem Sincronização de Threads

Sincronização de Threads Sincronização via wait e notifyAll Há também o método notify (escolha arbitrária) Só se pode usar wait(), notify() e notifyAll() quando se está de posse do lock do objeto (dentro de um bloco synchronized) wait() espera uma condição para o objeto corrente e esta condição ocorre com notify() no mesmo objeto wait() wait(milisegundos) wait(milisegundos, nanosegundos) Sincronização de Threads

Sincronização de Threads Vamos implementar o exemplo do produtor/consumidor... Sincronização de Threads

Sincronização de Threads Locks explícitos e variáveis condicionais Pode-se proteger regiões críticas com locks explícitos Permite proteger alguns statements Permite proteger múltiplos métodos Para criar um lock explícito, instancia-se uma implementação da interface Lock Em geral, ReentrantLock Sincronização de Threads

Sincronização de Threads Locks explícitos e variáveis condicionais Para obter o lock, utiliza-se o método lock() Para liberar... unlock() Uma vez que o lock não é liberado automaticamente, deve-se usar try...finally para garantir sua liberação Lock aLock = new ReentrantLock(); … aLock.lock(); try{ \\… }finally{ aLock.unlock(); } Sincronização de Threads

Sincronização de Threads Locks explícitos e variáveis condicionais Para esperar por um lock explícito, cria-se uma variável condicional Um objeto que implementa a interface Condition Usar Lock.newCondition() para criar uma condição A condição provê métodos: await() para esperar até a condição ser verdadeira signal() e signalAll() para avisar os threads que a condição ocorreu Sincronização de Threads

Sincronização de Threads Locks explícitos e variáveis condicionais Variações de await() await () - Espera uma condição ocorrer. awaitUninterruptibly() - Espera uma condição ocorrer. Não pode ser interrompido. awaitNanos(long timeout) - Espera uma condição ocorrer. Espera no máximo timeout nanossegundos. await(long timeout, TimeUnit unit) - Espera uma condição ocorrer. Espera no máximo timeout TimeUnit. await(Date timeout) - Espera uma condição ocorrer. Espera no máximo até a data especificada. Sincronização de Threads

Sincronização de Threads Locks explícitos e variáveis condicionais Exemplo da classe SharedResource import java.util.concurrent.locks.*; public class SharedResource { private int contents; private boolean available = false; private Lock aLock = new ReentrantLock(); private Condition condVar = aLock.newCondition(); //… } Sincronização de Threads

Sincronização de Threads Locks explícitos e variáveis condicionais Exemplo da classe SharedResource public int get() { aLock.lock(); try { while (available == false) { condVar.await(); //Esperar aviso de produção } catch (InterruptedException e) { } } available = false; //Notificar produtor de que número foi consumido condVar.signalAll(); } finally { aLock.unlock(); return contents; Sincronização de Threads

Sincronização de Threads Locks explícitos e variáveis condicionais Exemplo da classe SharedResource public void put(int value) { aLock.lock(); try { while (available == true) { try {condVar.await();//Esperar aviso de que foi consumido } catch (InterruptedException e) { } } contents = value; available = true; //Notificar consumidor de que número foi produzido condVar.signalAll(); } finally { aLock.unlock(); Sincronização de Threads

Sincronização de Threads Estruturas de dados sincronizadas Em vez de construir estruturas sincronizadas como o SharedObject, pode-se utilizar algumas pré-definidas Classes do pacote java.util.concurrent Exemplo: BlockingQueue Fila que trata de todos os detalhes de sincronização Sincronização de Threads

Sincronização de Threads Sincronizando coleções As coleções de Java em geral (ArrayList, ...) não são sincronizadas (não são thread-safe) Exceção é Vector Para criar coleções sincronizadas, deve-se criar um decorador da coleção que sincroniza os métodos Java já fornece tais decoradores na classe Collections Collections.synchronizedCollection() Collections.synchronizedList() Collections.synchronizedMap() Collections.synchronizedSet() Collections.synchronizedSortedMap() Collections.synchronizedSortedSet() Sincronização de Threads

Sincronização de Threads Sincronizando coleções Apenas a lista decorada deve ser usada a partir de então... Iterações devem ser sincronizadas... List list = Collections.synchronizedList(new ArrayList()); synchronized(list) { Iterator i = list.iterator(); // Deve estar dentro do bloco while (i.hasNext()) foo(i.next()); } Sincronização de Threads

Sincronização de Threads Starvation e deadlock... Várias threads competem por recursos... Equidade (fairness) existe quando cada thread recebe recursos suficientes para progredir Um sistema com equidade deve evitar starvation e deadlock Starvation ocorre quando uma ou mais threads não conseguem obter recursos para progredir Deadlock é uma starvation que ocorre quando as threads esperam por uma condição que nunca vai ocorrer Sincronização de Threads

Sincronização de Threads Starvation e deadlock... Exemplo clássico: filósofos! Cinco filósofos estão sentados numa mesa redonda Na frente de cada filósofo, há uma tijela de arroz Entre cada dois filósofos há um pauzinho chinês Para poder comer um bocado de arroz, um filósofo deve ter 2 pauzinhos: o da esquerda e da direita Os filósofos devem achar uma forma de compartilhar pauzinhos de forma a que todos possam comer Applet: http://dsc.ufcg.edu.br/~jacques/cursos/map/html/threads/sincronizacao.html Sincronização de Threads

O que vimos hoje? Threads Sincronização Sincronização de Threads

O que veremos na próxima aula? Threads Pool Sincronização de Threads

Dúvidas? ? Sincronização de Threads