Programação Concorrentewst/Curso/Programa%E7%E3o%20Concorrente... · 2010-09-23 · Coleções...

44
+ XV Jornada de Cursos CITi Aula 8 Programação Concorrente Benito Fernandes Fernando Castor João Paulo Oliveira Weslley Torres

Transcript of Programação Concorrentewst/Curso/Programa%E7%E3o%20Concorrente... · 2010-09-23 · Coleções...

Page 1: Programação Concorrentewst/Curso/Programa%E7%E3o%20Concorrente... · 2010-09-23 · Coleções concorrentes Interface BlockingQueue - Define uma estrutura FIFO – First-in-first-out

+

XV Jornada de Cursos CITi

Aula 8

Programação

ConcorrenteBenito FernandesFernando CastorJoão Paulo OliveiraWeslley Torres

Page 2: Programação Concorrentewst/Curso/Programa%E7%E3o%20Concorrente... · 2010-09-23 · Coleções concorrentes Interface BlockingQueue - Define uma estrutura FIFO – First-in-first-out

+Agenda

Coleções concorrentes

Blocking Queues

ConcurrentMap

ConcurrentNavigableMap

CyclicBarrier/CountdownLatch

Page 3: Programação Concorrentewst/Curso/Programa%E7%E3o%20Concorrente... · 2010-09-23 · Coleções concorrentes Interface BlockingQueue - Define uma estrutura FIFO – First-in-first-out

+Coleções concorrentes

Em vez de construir sua própria estrutura de dados sincronizada,você pode usar estruturas já prontas, com detalhes de sincronizaçãoescondidos.

Page 4: Programação Concorrentewst/Curso/Programa%E7%E3o%20Concorrente... · 2010-09-23 · Coleções concorrentes Interface BlockingQueue - Define uma estrutura FIFO – First-in-first-out

+

Filas (queues)

Page 5: Programação Concorrentewst/Curso/Programa%E7%E3o%20Concorrente... · 2010-09-23 · Coleções concorrentes Interface BlockingQueue - Define uma estrutura FIFO – First-in-first-out

+Coleções concorrentes

Interface BlockingQueue<E> - Define uma estrutura FIFO –First-in-first-out – que bloqueia na tentativa de adicionar em uma fila cheia ou retirar de uma fila vazia.

Interface ConcurrentMap<K,V> - Define operações atômicas para adição, remoção e atualização de dados.

ConcurrentHashMap – implementação padrão da interface ConcurrentMap<K,V>, é uma “versão” concorrente de HashMap

Interface ConcurrentNavigableMap<K,V> - é uma

subinterface de ConcurrentMap

Page 6: Programação Concorrentewst/Curso/Programa%E7%E3o%20Concorrente... · 2010-09-23 · Coleções concorrentes Interface BlockingQueue - Define uma estrutura FIFO – First-in-first-out

+BlockingQueue<E>

Fornece métodos para acesso a uma fila de elementos genérica que bloqueia automaticamente alguma condição de impedir o acesso

Principais métodos:

put() coloca elemento na fila, aguardando se ela estiver cheia

take() retira o elemento da fila, aguardando se ela estiver vazia

remainingCapacity() informa o número de lugares restantes na fila

Page 7: Programação Concorrentewst/Curso/Programa%E7%E3o%20Concorrente... · 2010-09-23 · Coleções concorrentes Interface BlockingQueue - Define uma estrutura FIFO – First-in-first-out

+BlockingQueue<E>

Implementações de BlockingQueue

ArrayBlockingQueue: array bloqueante (ordem: FIFO, tamanho: fixo)

DelayQueue: fila na qual um elemento só pode ser retirado após seu delayexpirar (ordem: tempo de vida, tamanho: variável)

LinkedBlockingQueue: fila encadeada bloqueante (ordem: FIFO, tamanho: variável)

PriorityBlockingQueue: fila bloqueante com acesso aos elementos em ordem de prioridade (ordem de prioridade, tamanho: variável)

SynchronousQueue: cada put() é sincronizado com um take() (sem ordenação, tamanho zero)

Page 8: Programação Concorrentewst/Curso/Programa%E7%E3o%20Concorrente... · 2010-09-23 · Coleções concorrentes Interface BlockingQueue - Define uma estrutura FIFO – First-in-first-out

+

Page 9: Programação Concorrentewst/Curso/Programa%E7%E3o%20Concorrente... · 2010-09-23 · Coleções concorrentes Interface BlockingQueue - Define uma estrutura FIFO – First-in-first-out

+Exercício

Implemente um relacionamento de produtor/consumidor utilizando ainterface BlockingQueue e a classe ArrayBlockingQueue.

Page 10: Programação Concorrentewst/Curso/Programa%E7%E3o%20Concorrente... · 2010-09-23 · Coleções concorrentes Interface BlockingQueue - Define uma estrutura FIFO – First-in-first-out

+Resolução

Page 11: Programação Concorrentewst/Curso/Programa%E7%E3o%20Concorrente... · 2010-09-23 · Coleções concorrentes Interface BlockingQueue - Define uma estrutura FIFO – First-in-first-out

+Resolução

Page 12: Programação Concorrentewst/Curso/Programa%E7%E3o%20Concorrente... · 2010-09-23 · Coleções concorrentes Interface BlockingQueue - Define uma estrutura FIFO – First-in-first-out

+Resolução

Page 13: Programação Concorrentewst/Curso/Programa%E7%E3o%20Concorrente... · 2010-09-23 · Coleções concorrentes Interface BlockingQueue - Define uma estrutura FIFO – First-in-first-out

+Testando ArrayBlockingQueue!

O que acontece ao colocar um sleep() no consumidor e qual é o estado das threads?

Page 14: Programação Concorrentewst/Curso/Programa%E7%E3o%20Concorrente... · 2010-09-23 · Coleções concorrentes Interface BlockingQueue - Define uma estrutura FIFO – First-in-first-out

+

Page 15: Programação Concorrentewst/Curso/Programa%E7%E3o%20Concorrente... · 2010-09-23 · Coleções concorrentes Interface BlockingQueue - Define uma estrutura FIFO – First-in-first-out

+

Page 16: Programação Concorrentewst/Curso/Programa%E7%E3o%20Concorrente... · 2010-09-23 · Coleções concorrentes Interface BlockingQueue - Define uma estrutura FIFO – First-in-first-out

+Exercício

Faça as alterações no código anterior de modo que seja utilizado DelayQueue.

Modifique o código para utilizar a interface, SynchronousQueue.

Page 17: Programação Concorrentewst/Curso/Programa%E7%E3o%20Concorrente... · 2010-09-23 · Coleções concorrentes Interface BlockingQueue - Define uma estrutura FIFO – First-in-first-out

+Diagrama de Classes

Fonte: http://en.wikibooks.org/wiki/Java_Programming/Collection_Classes

Page 18: Programação Concorrentewst/Curso/Programa%E7%E3o%20Concorrente... · 2010-09-23 · Coleções concorrentes Interface BlockingQueue - Define uma estrutura FIFO – First-in-first-out

+ConcurrentHashMap

Foi desenhado para otimizar operações de recuperação.

A operação de recuperação irá retornar o valor inserido pela operação de inserção mais recente concluído.

Pode retornar um valor acrescentado de uma operação de inserção que ainda está em andamento.

Em nenhum caso ele retornará um resultado sem sentido.

Page 19: Programação Concorrentewst/Curso/Programa%E7%E3o%20Concorrente... · 2010-09-23 · Coleções concorrentes Interface BlockingQueue - Define uma estrutura FIFO – First-in-first-out

+EscalabilidadeHashtable vs ConcurrentHashMap

Fonte: http://www.ibm.com/developerworks/java/library/j-jtp07233.html

Page 20: Programação Concorrentewst/Curso/Programa%E7%E3o%20Concorrente... · 2010-09-23 · Coleções concorrentes Interface BlockingQueue - Define uma estrutura FIFO – First-in-first-out

+Sincronizando coleções

As coleções de Java (ArrayList, LinkedList...) não são sincronizadas.

O uso dessas coleções não seja “thread-safe”.

Vector é exceção

Para criar coleções sincronizadas, você pode criar um “decorador” da coleção que sincroniza os métodos.

Java já fornece tais decoradores na classe Collections

Collection

List

Map

Set

Page 21: Programação Concorrentewst/Curso/Programa%E7%E3o%20Concorrente... · 2010-09-23 · Coleções concorrentes Interface BlockingQueue - Define uma estrutura FIFO – First-in-first-out

+

É importante que apenas a nova lista seja utilizada a partir desse ponto

A lista original não deve ser tocada diretamente.

Utilização de uma lista sincronizada

Page 22: Programação Concorrentewst/Curso/Programa%E7%E3o%20Concorrente... · 2010-09-23 · Coleções concorrentes Interface BlockingQueue - Define uma estrutura FIFO – First-in-first-out

+Utilização de uma lista sincronizada

Métodos disponíveis para criar esses decoradores:

synchronizedCollection()

synchronizedList()

synchronizedMap()

synchronizedSet()

synchronizedSortedMap()

synchronizedSortedSet()

Page 23: Programação Concorrentewst/Curso/Programa%E7%E3o%20Concorrente... · 2010-09-23 · Coleções concorrentes Interface BlockingQueue - Define uma estrutura FIFO – First-in-first-out

+Utilização de um iterator

Há um problema especial no uso de um iterator. Ao usar umiterator, temos que "entrar" e "sair" do iterator usando doismétodos (hasNext e next)

Se cada um desses métodos fosse sincronized, ainda nãoteríamos uma solução, pois o que o next() retorna tem quecorresponder a o que hasNext() respondeu antes

Portanto, temos que fazer uma sincronização atômica com os dois

Page 24: Programação Concorrentewst/Curso/Programa%E7%E3o%20Concorrente... · 2010-09-23 · Coleções concorrentes Interface BlockingQueue - Define uma estrutura FIFO – First-in-first-out

+Exemplo de utilização de iterator

Page 25: Programação Concorrentewst/Curso/Programa%E7%E3o%20Concorrente... · 2010-09-23 · Coleções concorrentes Interface BlockingQueue - Define uma estrutura FIFO – First-in-first-out

+Barreira - Barrier

Page 26: Programação Concorrentewst/Curso/Programa%E7%E3o%20Concorrente... · 2010-09-23 · Coleções concorrentes Interface BlockingQueue - Define uma estrutura FIFO – First-in-first-out

+Barreira - Barrier

Fonte: Utilitários para Programação Concorrente. Helder da Rocha. Agosto 2005

Page 27: Programação Concorrentewst/Curso/Programa%E7%E3o%20Concorrente... · 2010-09-23 · Coleções concorrentes Interface BlockingQueue - Define uma estrutura FIFO – First-in-first-out

+Exemplo de barreira

Page 28: Programação Concorrentewst/Curso/Programa%E7%E3o%20Concorrente... · 2010-09-23 · Coleções concorrentes Interface BlockingQueue - Define uma estrutura FIFO – First-in-first-out

+Exemplo de barreira

Page 29: Programação Concorrentewst/Curso/Programa%E7%E3o%20Concorrente... · 2010-09-23 · Coleções concorrentes Interface BlockingQueue - Define uma estrutura FIFO – First-in-first-out

+Exemplo de barreira

Page 30: Programação Concorrentewst/Curso/Programa%E7%E3o%20Concorrente... · 2010-09-23 · Coleções concorrentes Interface BlockingQueue - Define uma estrutura FIFO – First-in-first-out

+Exemplo de barreira

Page 31: Programação Concorrentewst/Curso/Programa%E7%E3o%20Concorrente... · 2010-09-23 · Coleções concorrentes Interface BlockingQueue - Define uma estrutura FIFO – First-in-first-out

+CyclicBarrier

Permite que um conjunto de threads aguardem uns aos outros para chegarem a um ponto comum de barreira.

São úteis em programas que envolvem um número fixo de threads que devem esperar, ocasionalmente, um pelo o outro.

A barreira é chamada cíclica, pois pode ser reutilizada após as threads em espera serem liberadas.

Page 32: Programação Concorrentewst/Curso/Programa%E7%E3o%20Concorrente... · 2010-09-23 · Coleções concorrentes Interface BlockingQueue - Define uma estrutura FIFO – First-in-first-out

+CyclicBarrier

Page 33: Programação Concorrentewst/Curso/Programa%E7%E3o%20Concorrente... · 2010-09-23 · Coleções concorrentes Interface BlockingQueue - Define uma estrutura FIFO – First-in-first-out

+Exemplo - CyclicBarrier

Page 34: Programação Concorrentewst/Curso/Programa%E7%E3o%20Concorrente... · 2010-09-23 · Coleções concorrentes Interface BlockingQueue - Define uma estrutura FIFO – First-in-first-out

+Exemplo - CyclicBarrier

Page 35: Programação Concorrentewst/Curso/Programa%E7%E3o%20Concorrente... · 2010-09-23 · Coleções concorrentes Interface BlockingQueue - Define uma estrutura FIFO – First-in-first-out

+Possíveis resultados

Page 36: Programação Concorrentewst/Curso/Programa%E7%E3o%20Concorrente... · 2010-09-23 · Coleções concorrentes Interface BlockingQueue - Define uma estrutura FIFO – First-in-first-out

+CountDownLatch

CountDownLatch é um estilo de sincronização quepermite 1 ou mais threads esperarem até que umconjunto de operações que serão realizadas em outrasthreads sejam concluída.“

Em programção concorrente um latch é um tipo de“switch” ou “trigger”.

É iniciado com um valor e esse valor é decrementado.

Em momentos estratégicos threads esperam que a contagemchegue a 0 para continuar o processamento.

Page 37: Programação Concorrentewst/Curso/Programa%E7%E3o%20Concorrente... · 2010-09-23 · Coleções concorrentes Interface BlockingQueue - Define uma estrutura FIFO – First-in-first-out

+CountDownLatch

Um CountDownLatch é um tipo de barreira

É inicializado com valor inicial para um contador regressivo

Threads chamam await() e esperam a contagem chegar a zero

Outros threads podem chamar countDown() para reduzir a contagem

Quando a contagem finalmente chegar a zero, a barreira é vencida (o trinco é aberto)

Pode ser usado no lugar de CyclicBarrier

Quando liberação depender de outro(s) fator(es) que não seja(m)a simples contagem de threads

Page 38: Programação Concorrentewst/Curso/Programa%E7%E3o%20Concorrente... · 2010-09-23 · Coleções concorrentes Interface BlockingQueue - Define uma estrutura FIFO – First-in-first-out

+CountDownLatch

Fonte: Utilitários para Programação Concorrente. Helder da Rocha. Agosto 2005

Page 39: Programação Concorrentewst/Curso/Programa%E7%E3o%20Concorrente... · 2010-09-23 · Coleções concorrentes Interface BlockingQueue - Define uma estrutura FIFO – First-in-first-out

+Iniciar várias threads ao mesmo tempo

Para coordenar o inicio de várias threads,

Cria um objeto CountDownLatch com o contador em 1

Após a criação de todas as threads, o método run() dá continuidade ao processamento

Page 40: Programação Concorrentewst/Curso/Programa%E7%E3o%20Concorrente... · 2010-09-23 · Coleções concorrentes Interface BlockingQueue - Define uma estrutura FIFO – First-in-first-out

+Exemplo CountDownLatch

Page 41: Programação Concorrentewst/Curso/Programa%E7%E3o%20Concorrente... · 2010-09-23 · Coleções concorrentes Interface BlockingQueue - Define uma estrutura FIFO – First-in-first-out

+Exemplo CountDownLatch

Page 42: Programação Concorrentewst/Curso/Programa%E7%E3o%20Concorrente... · 2010-09-23 · Coleções concorrentes Interface BlockingQueue - Define uma estrutura FIFO – First-in-first-out

+Possíveis resultados

Page 43: Programação Concorrentewst/Curso/Programa%E7%E3o%20Concorrente... · 2010-09-23 · Coleções concorrentes Interface BlockingQueue - Define uma estrutura FIFO – First-in-first-out

+Referências

http://download.oracle.com/docs/cd/E17409_01/javase/tutorial/essential/concurrency/collections.html

http://www.dsc.ufcg.edu.br/~jacques/cursos/map/html/threads/sincronizacao.html

http://www.ibm.com/developerworks/java/library/j-jtp07233.html

http://onjava.com/pub/a/onjava/excerpt/jthreads3_ch6/index1.html

http://mark.koli.ch/2010/04/understanding-javas-countdownlatch.html

Page 44: Programação Concorrentewst/Curso/Programa%E7%E3o%20Concorrente... · 2010-09-23 · Coleções concorrentes Interface BlockingQueue - Define uma estrutura FIFO – First-in-first-out

+Referências

http://www.javamex.com/tutorials/threads/CountDownLatch.shtml

http://download.oracle.com/docs/cd/E17476_01/javase/1.5.0/docs/api/java/util/concurrent/CyclicBarrier.html

http://programmingexamples.wikidot.com/cyclicbarrier

Utilitários para Programação Concorrente. Helder da Rocha. Agosto 2005