+
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
Top Related