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

Post on 08-Jul-2020

1 views 0 download

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

+

XV Jornada de Cursos CITi

Aula 8

Programação

ConcorrenteBenito FernandesFernando CastorJoão Paulo OliveiraWeslley Torres

+Agenda

Coleções concorrentes

Blocking Queues

ConcurrentMap

ConcurrentNavigableMap

CyclicBarrier/CountdownLatch

+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.

+

Filas (queues)

+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

+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

+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)

+

+Exercício

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

+Resolução

+Resolução

+Resolução

+Testando ArrayBlockingQueue!

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

+

+

+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.

+Diagrama de Classes

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

+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.

+EscalabilidadeHashtable vs ConcurrentHashMap

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

+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

+

É 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

+Utilização de uma lista sincronizada

Métodos disponíveis para criar esses decoradores:

synchronizedCollection()

synchronizedList()

synchronizedMap()

synchronizedSet()

synchronizedSortedMap()

synchronizedSortedSet()

+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

+Exemplo de utilização de iterator

+Barreira - Barrier

+Barreira - Barrier

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

+Exemplo de barreira

+Exemplo de barreira

+Exemplo de barreira

+Exemplo de barreira

+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.

+CyclicBarrier

+Exemplo - CyclicBarrier

+Exemplo - CyclicBarrier

+Possíveis resultados

+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.

+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

+CountDownLatch

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

+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

+Exemplo CountDownLatch

+Exemplo CountDownLatch

+Possíveis resultados

+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

+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