Skip to content

Commit 1c6dd35

Browse files
authored
Merge pull request #45 from duke-certification/develop
Primeira versão estável do livro
2 parents 621ced0 + 2277b79 commit 1c6dd35

File tree

126 files changed

+5515
-17
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

126 files changed

+5515
-17
lines changed

.idea/compiler.xml

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

LICENSE.asc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
MIT License
22

3-
Copyright (c) 2019 Rinaldo Pitzer e Rodrigo Moutinho
3+
Copyright (c) 2019 Rinaldo Pitzer Jr. e Rodrigo Moutinho
44

55
Permission is hereby granted, free of charge, to any person obtaining a copy
66
of this software and associated documentation files (the "Software"), to deal

README.asc

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
= Guia Open Source para Certificação: Atualize sua certificação Java 6 para Java 8
1+
= Guia Prático para Certificação: Atualize sua certificação Java 6 para Java 8
22

3-
image:https://img.shields.io/travis/com/duke-certification/java6-to-java8.svg[Travis (.com)] image:https://img.shields.io/github/release/duke-certification/java6-to-java8.svg[GitHub release] image:https://img.shields.io/github/release-date/duke-certification/java6-to-java8.svg[GitHub Release Date] image:https://img.shields.io/github/downloads/duke-certification/java6-to-java8/total.svg[GitHub All Releases] image:https://img.shields.io/github/issues/duke-certification/java6-to-java8.svg[GitHub issues] image:https://img.shields.io/github/license/duke-certification/java6-to-java8.svg[GitHub License]
3+
image:https://img.shields.io/travis/com/duke-certification/java6-to-java8.svg[Travis (.com), link=https://travis-ci.com/duke-certification/java6-to-java8] image:https://img.shields.io/github/release/duke-certification/java6-to-java8.svg[GitHub release] image:https://img.shields.io/github/release-date/duke-certification/java6-to-java8.svg[GitHub Release Date] image:https://img.shields.io/github/downloads/duke-certification/java6-to-java8/total.svg[GitHub All Releases] image:https://img.shields.io/github/issues/duke-certification/java6-to-java8.svg[GitHub issues] image:https://img.shields.io/github/license/duke-certification/java6-to-java8.svg[GitHub License]
44

55
Este projeto serve como material de apoio na realização do exame *https://education.oracle.com/upgrade-to-java-se-8-ocp/pexam_1Z0-813[1Z0-813]* que atualiza qualquer profissional com certificação Java 6 ou inferior, para a versão 8. No momento desta documentação, o _voucher_ do exame custa R$ 597,00 no Brasil.
66

7-
image::images/ebook-1-400x400.png[Guia Open Source para Certificação,align="center"]
7+
image::images/ebook-400x400.png[Guia Open Source para Certificação,align="center"]
88

99
Baixe a versão mais recente do ebook https://github.com/duke-certification/java6-to-java8/releases[no link de releases].
1010

@@ -31,7 +31,7 @@ docker run --rm -v <caminho>:/documents/ asciidoctor/docker-asciidoctor scripts/
3131

3232
== Referências
3333

34-
Em todas sessões do livro são feitas referências diretas as fontes de inspiração ou argumentação base para a criação deste conteúdo. A seguir o resumo dessas e de outras referências que também fizeram parte dessa jornada de aprendizado.
34+
Em todas sessões do livro são feitas referências diretas as fontes de inspiração ou argumentação base para a criação deste conteúdo. A seguir o resumo das principais e de outras referências que também fizeram parte dessa jornada de aprendizado.
3535

3636
Para criação da estrutura do projeto deste livro foi utilizado como base o projeto https://github.com/rcmoutinho/ebook-with-asciidoctor[ebook-with-asciidoctor].
3737

@@ -43,7 +43,7 @@ Boyarsky, Jeanne; Selikoff, Scott. OCP: Oracle Certified Professional Java SE 8
4343
+
4444
https://www.amazon.com.br/dp/B0191U2H8C[Link na loja Amazon Brasil].
4545

46-
* *(en-US)* Blog do Eugen (Baeldung) com dezenas de artigos focados em Java e também outros assuntos.
46+
* *(en-US)* Blog do Eugen (Baeldung) com dezenas de artigos focados em Java, entre outros assuntos.
4747
+
4848
https://www.baeldung.com/category/java/
4949

@@ -63,6 +63,6 @@ https://www.alura.com.br/formacao-certificacao-java
6363

6464
* *(pt-BR)* Canal do YouTube https://www.youtube.com/channel/UCyRDiqqSkqGvTE_wIB1nN1w[RinaldoDev] com vídeos explicativos de diversos conceitos da linguagem Java.
6565

66-
* *(en-US)* https://www.youtube.com/playlist?list=PL3py5YSIGvPMgKXOVqnYn9nBoT_zvsvsi[_Java Challenges Explanations_], uma playlist no Youtube do canal do https://twitter.com/RafaDelNero[Rafael Del Nero] que explica desafios de Java para ensinar conceitos importantes da linguagem.
66+
* *(en-US)* https://www.youtube.com/playlist?list=PL3py5YSIGvPMgKXOVqnYn9nBoT_zvsvsi[_Java Challengers_], uma playlist no Youtube do canal do https://twitter.com/RafaDelNero[Rafael Del Nero] que explica desafios de Java para ensinar conceitos importantes da linguagem.
6767

6868
* *(en-US)* https://devgym.oracle.com/pls/apex/dg/competition/java[Oracle Dev Gym], desafios online e gratuitos para testar suas habilidades de Java.
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
11
=== Objetivos
22

3-
Em breve...
3+
Como guia para criação deste livro foi utilizado todos os objetivos citados na seção _"Review Exam Topics"_, de acordo com o https://education.oracle.com/upgrade-to-java-se-8-ocp/pexam_1Z0-813[site da certificação].
4+
5+
A missão deste livro é criar o maior número de exemplos práticos possíveis para ajudar você a colocar a mão na massa. Quanto maior for seu contato com os códigos da versão 8 do Java, mais confiante estará na hora do exame, e também para lidar com projetos em Java 8 no mercado de trabalho.

book/05-java-streams/sections/02-parallel-streams.asc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ B
114114
+
115115
Perceba que a ordem foi respeitada na última operação do _Stream_, o `forEachOrdered`, mas não foi respeitada na execução da operação intermediária `map`. Isso ocorre porque essa operação intermediária não precisa seguir a ordem dos itens do stream.
116116

117-
. A operação `findAny` pode trazer qualquer resultado em uma operação paralela.
117+
. Diferente da execução em um _Stream_ sequencial, a operação `findAny` traz resultados realmente aleatórios ao ser executada em um _Stream_ paralelo.
118118
+
119119
[source,java,indent=0]
120120
.{java-package}/parallelstreams/Streams_ParallelFindAny.java
Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
:java-package: src/org/j6toj8/concurrency
2+
:section-java-package: ../../../{java-package}
3+
4+
=== Pacote `Concurrent`
5+
6+
.Objetivo
7+
--------------------------------------------------
8+
Use classes from the java.util.concurrent package including CyclicBarrier and CopyOnWriteArrayList with a focus on the advantages over and differences from the traditional java.util collections
9+
-
10+
Usar classes do pacote java.util.concurrent, incluindo CyclicBarrier e CopyOnWriteArrayList, com foco nas vantagens e diferenças das Coleções tradicionais do pacote java.util
11+
--------------------------------------------------
12+
13+
O pacote `java.util.concurrent` inclui inúmeras classes para serem utilizadas em aplicações multi-thread. Nesta seção serão apresentadas algumas dessas classes.
14+
15+
Muitas das classes do pacote concurrent são apenas versões das coleções comuns, porém com blocos __syncronized__, garantindo que múltiplas _threads_ poderão acessá-las ao mesmo tempo mantendo sua integridade. As classes __ConcurrentHashMap__, _ConcurrentLinkedQueue_ e _ConcurrentLinkedDeque_ são exemplos disso. Por isso é importante conhecer e lembrar das coleções comuns do Java 6.
16+
17+
Todas as seções deste capítulo podem conter exemplos maiores do que os que foram apresentados até agora, principalmente quando for necessário a criação de mútiplas __Threads__. É importante dedicar um tempo maior para entender cada um desses exemplos.
18+
19+
. É possível criar uma *Fila* que lança uma exceção após um tempo predefinido utilizando a classe ``LinkedBlockingQueue``.
20+
+
21+
[source,java,indent=0]
22+
.{java-package}/concurrentpackage/Concurrency_LinkedBlockingQueue.java
23+
----
24+
include::{section-java-package}/concurrentpackage/Concurrency_LinkedBlockingQueue.java[tag=code]
25+
----
26+
27+
. É possível criar uma *Fila Duplamente Ligada (Deque)* que lança uma exceção após um tempo predefinido utilizando a classe ``LinkedBlockingDeque``.
28+
+
29+
[source,java,indent=0]
30+
.{java-package}/concurrentpackage/Concurrency_LinkedBlockingDeque.java
31+
----
32+
include::{section-java-package}/concurrentpackage/Concurrency_LinkedBlockingDeque.java[tag=code]
33+
----
34+
35+
. É possível criar uma lista que aloca todo o seu conteúdo em um novo _array_ sempre que é modificada utilizando a classe ``CopyOnWriteArrayList``.
36+
+
37+
[source,java,indent=0]
38+
.{java-package}/concurrentpackage/Concurrency_CopyOnWriteArrayList.java
39+
----
40+
include::{section-java-package}/concurrentpackage/Concurrency_CopyOnWriteArrayList.java[tag=code]
41+
----
42+
+
43+
.Saída no console
44+
[source,console]
45+
----
46+
A
47+
B
48+
C
49+
Lista final: [A, B, C, D]
50+
----
51+
+
52+
Perceba que foi possível acrescentar um valor na lista durante a execução do _forEach_. Em uma lista tradicional haveria ocorrido uma ``ConcurrentModificationException``.
53+
+
54+
Perceba também que, mesmo alterando a lista dentro do __forEach__, a letra "D" não aparece no console. Isso ocorre pois, quando a letra "D" foi inserida na lista, um novo _array_ foi alocado internamente contendo todos os novos elementos, e a iteração continuou ocorrendo no _array_ antigo.
55+
56+
. É possível criar versões _syncronized_ de coleções utilizando métodos utilitários da classe ``Collections``.
57+
+
58+
[source,java,indent=0]
59+
.{java-package}/concurrentpackage/Concurrency_CollectionsSyncronized.java
60+
----
61+
include::{section-java-package}/concurrentpackage/Concurrency_CollectionsSyncronized.java[tag=code]
62+
----
63+
64+
. *Não* é possível adicionar ou remover elementos durante o _forEach_ de uma coleção sincronizada que foi criada utilizando o método da classe ``Collections``.
65+
+
66+
[source,java,indent=0]
67+
.{java-package}/concurrentpackage/Concurrency_CollectionsSyncronizedForEach.java
68+
----
69+
include::{section-java-package}/concurrentpackage/Concurrency_CollectionsSyncronizedForEach.java[tag=code]
70+
----
71+
+
72+
.Saída no console
73+
[source,console]
74+
----
75+
Exception in thread "main" java.util.ConcurrentModificationException
76+
at java.util.HashMap$HashIterator.nextNode(HashMap.java:1445)
77+
at java.util.HashMap$EntryIterator.next(HashMap.java:1479)
78+
at java.util.HashMap$EntryIterator.next(HashMap.java:1477)
79+
at org.j6toj8.concurrency.concurrentpackage.Concurrency_CollectionsSyncronizedForEach.main(Concurrency_CollectionsSyncronizedForEach.java:18)
80+
----
81+
+
82+
Perceba que, apesar do `Map` ter sido transformado em __syncronized__, não é possível alterá-lo durante uma iteração com __forEach__. Isso é possível apenas nas versões _Concurrent_ das coleções.
83+
84+
. É possível sincronizar a execução de várias _threads_ utilizando a classe ``CyclicBarrier``.
85+
+
86+
[source,java,indent=0]
87+
.{java-package}/concurrentpackage/Concurrency_CyclicBarrier.java
88+
----
89+
include::{section-java-package}/concurrentpackage/Concurrency_CyclicBarrier.java[tag=code]
90+
----
91+
+
92+
.Saída no console
93+
[source,console]
94+
----
95+
Thread-2: Primeira Parte
96+
Thread-1: Primeira Parte
97+
Thread-0: Primeira Parte
98+
Thread-1: Segunda Parte
99+
Thread-2: Segunda Parte
100+
Thread-0: Segunda Parte
101+
Thread-0: Terceira Parte
102+
Thread-1: Terceira Parte
103+
Thread-2: Terceira Parte
104+
----
105+
+
106+
Neste exemplo estão sendo criadas 3 __threads__. Todas executam instâncias da classe `Acao` que recebem a mesma instância da classe ``CyclicBarrier``. Toda vez que uma _thread_ faz uma chamada ao método `await` da instância de ``cyclicBarrier``, ela fica suspensa até que todas as outras _threads_ cheguem até aquele mesmo ponto. Por isso todas as _threads_ imprimem no console de forma sincronizada. Se não houvesse sincronização, a saída no console seria completamente imprevisível. Abaixo é o exemplo de uma execução sem a chamada ao método `await`:
107+
+
108+
.Saída no console caso não houvesse CyclicBarrier
109+
[source,console]
110+
----
111+
Thread-0: Primeira Parte
112+
Thread-1: Primeira Parte
113+
Thread-1: Segunda Parte
114+
Thread-1: Terceira Parte
115+
Thread-2: Primeira Parte
116+
Thread-0: Segunda Parte
117+
Thread-2: Segunda Parte
118+
Thread-0: Terceira Parte
119+
Thread-2: Terceira Parte
120+
121+
----
122+
123+
****
124+
125+
* Using Concurrent Collections
126+
+
127+
Boyarsky, Jeanne; Selikoff, Scott. OCP: Oracle Certified Professional Java SE 8 Programmer II Study Guide (p. 358). Wiley. Edição do Kindle.
128+
129+
* https://www.baeldung.com/java-util-concurrent[Overview of the java.util.concurrent.]
130+
131+
* https://www.baeldung.com/java-cyclic-barrier[CyclicBarrier in Java.]
132+
133+
* https://docs.oracle.com/javase/tutorial/essential/concurrency/collections.html[Concurrent Collections.] The Java™ Tutorials.
134+
135+
* https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/package-summary.html[Package java.util.concurrent.] Java Plataform SE 8.
136+
137+
****
Lines changed: 173 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,173 @@
1+
:java-package: src/org/j6toj8/concurrency
2+
:section-java-package: ../../../{java-package}
3+
4+
=== Locks
5+
6+
.Objetivo
7+
--------------------------------------------------
8+
Use Lock, ReadWriteLock, and ReentrantLock classes in the java.util.concurrent.locks and java.util.concurrent.atomic packages to support lock-free thread-safe programming on single variables
9+
-
10+
Usar classes dos tipos Lock, ReadWriteLock, e ReentrantLock dos pacotes java.util.concurrent.locks e java.util.concurrent.atomic para suportar programação sem bloqueio e multi-thread em variáveis únicas
11+
--------------------------------------------------
12+
13+
As classes e interfaces `Lock`, `ReadWriteLock` e `ReentrantLock` permitem obter diferentes tipos de _Locks_ (em tradução livre: bloqueios ou travas). Esses _Locks_ são utilizados para que um número limitado de _threads_ tenham acesso a mesma variável em um determinado momento, ou para que apenas uma delas possa alterar seu valor.
14+
15+
Nesta seção serão apresentados exemplos utilizando essas classes e interfaces. Assim como em outras seções deste capítulo, os exemplos podem ser grandes quando for necessário a criação de __threads__. Dedique um tempo maior para entendê-los completamente.
16+
17+
==== Reentrant Lock
18+
19+
. É possível adquirir um _Lock_ utilizando a classe ``ReentrantLock``.
20+
+
21+
[source,java,indent=0]
22+
.{java-package}/locks/Locks_ReentrantLock.java
23+
----
24+
include::{section-java-package}/locks/Locks_ReentrantLock.java[tag=code]
25+
----
26+
+
27+
.Saída no console
28+
[source,console]
29+
----
30+
ABC
31+
----
32+
+
33+
Perceba que o _lock_ é removido dentro de um bloco ``finally``. Isso garante que uma _thread_ não irá ficar com um _lock_ indeterminadamente.
34+
35+
. Chamar o método unlock sem ter obtido um lock anteriormente irá lançar uma exceção.
36+
+
37+
[source,java,indent=0]
38+
.{java-package}/locks/Locks_UnlockWithoutLock.java
39+
----
40+
include::{section-java-package}/locks/Locks_UnlockWithoutLock.java[tag=code]
41+
----
42+
+
43+
.Saída no console
44+
[source,console]
45+
----
46+
ABC
47+
Exception in thread "main" java.lang.IllegalMonitorStateException
48+
at java.util.concurrent.locks.ReentrantLock$Sync.tryRelease(ReentrantLock.java:151)
49+
at java.util.concurrent.locks.AbstractQueuedSynchronizer.release(AbstractQueuedSynchronizer.java:1261)
50+
at java.util.concurrent.locks.ReentrantLock.unlock(ReentrantLock.java:457)
51+
at org.j6toj8.concurrency.locks.Locks_UnlockWithoutLock.main(Locks_UnlockWithoutLock.java:14)
52+
----
53+
54+
. É possível tentar obter um _lock_ imediatamente utilizando o método ``tryLock``.
55+
+
56+
[source,java,indent=0]
57+
.{java-package}/locks/Locks_TryLock.java
58+
----
59+
include::{section-java-package}/locks/Locks_TryLock.java[tag=code]
60+
----
61+
+
62+
.Saída no console
63+
[source,console]
64+
----
65+
ABC
66+
----
67+
68+
. Também é possível tentar obter um _lock_ definindo um tempo de espera máximo.
69+
+
70+
[source,java,indent=0]
71+
.{java-package}/locks/Locks_TryLockTimeout.java
72+
----
73+
include::{section-java-package}/locks/Locks_TryLockTimeout.java[tag=code]
74+
----
75+
+
76+
.Saída no console
77+
[source,console]
78+
----
79+
ABC
80+
----
81+
82+
. Em um cenário com várias __threads__, é possível que apenas uma delas consiga obter um __lock__.
83+
+
84+
[source,java,indent=0]
85+
.{java-package}/locks/Locks_TryLockMultithread.java
86+
----
87+
include::{section-java-package}/locks/Locks_TryLockMultithread.java[tag=code]
88+
----
89+
+
90+
.Saída no console
91+
[source,console]
92+
----
93+
Thread-0: Conseguiu o Lock
94+
Thread-2: Conseguiu o Lock
95+
----
96+
+
97+
Nesta execução com 3 __threads__, apenas duas conseguiram obter o _lock_ imediatamente e imprimir no console. Porém o resultado é imprevisível. Podem existir execuções onde todas obterão o __lock__, e outras em que apenas uma thread conseguirá.
98+
99+
. Uma _thread_ pode obter mais de um _lock_ no mesmo objeto ``Lock``, mas deve desfazer o _lock_ múltiplas vezes também.
100+
+
101+
[source,java,indent=0]
102+
.{java-package}/locks/Locks_LockTwice.java
103+
----
104+
include::{section-java-package}/locks/Locks_LockTwice.java[tag=code]
105+
----
106+
+
107+
.Saída no console
108+
[source,console]
109+
----
110+
ABC
111+
----
112+
+
113+
Como a _thread_ chamou `lock` duas vezes, caso ela não houvesse chamado `unlock` duas vezes, outra _thread_ não seria capaz de obter o __lock__.
114+
115+
. É possível garantir uma distribuição mais "justa" de _locks_ passando `true` como argumento para o ``ReentrantLock``.
116+
+
117+
[source,java,indent=0]
118+
.{java-package}/locks/Locks_Fair.java
119+
----
120+
include::{section-java-package}/locks/Locks_Fair.java[tag=code]
121+
----
122+
+
123+
Ao passar o argumento ``true``, quando várias _threads_ estiverem esperando pelo mesmo __lock__, ele será dado àquela _thread_ que está aguardando a mais tempo.
124+
125+
==== ReentrantReadWriteLock
126+
127+
. É possível separar _locks_ de leitura e escrita utilizando a classe ``ReadWriteLock``. _Locks_ de leitura podem ser obtidos por múltiplas _threads_, porém _locks_ de escrita não.
128+
+
129+
[source,java,indent=0]
130+
.{java-package}/locks/Locks_ReadWriteLock.java
131+
----
132+
include::{section-java-package}/locks/Locks_ReadWriteLock.java[tag=code]
133+
----
134+
+
135+
.Saída no console
136+
[source,console]
137+
----
138+
Thread-0: Conseguiu o Lock de leitura
139+
Thread-2: Conseguiu o Lock de leitura
140+
Thread-1: Conseguiu o Lock de leitura
141+
Thread-1: Conseguiu o Lock de escrita
142+
----
143+
+
144+
Perceba que todas as _threads_ conseguiram obter o _lock_ de leitura, porém apenas uma conseguiu obter o _lock_ de escrita.
145+
146+
. Se uma _thread_ já possuir o _lock_ de escrita, outras não conseguirão obter nem mesmo o _lock_ de leitura.
147+
+
148+
[source,java,indent=0]
149+
.{java-package}/locks/Locks_ReadWriteLockInverted.java
150+
----
151+
include::{section-java-package}/locks/Locks_ReadWriteLockInverted.java[tag=code]
152+
----
153+
+
154+
.Saída no console
155+
[source,console]
156+
----
157+
Thread-0: Conseguiu o Lock de escrita
158+
Thread-0: Conseguiu o Lock de leitura
159+
----
160+
+
161+
Perceba que neste exemplo o _lock_ de escrita está sendo obtido *antes* do de leitura, de tal forma que apenas a primeira _thread_ que foi executada conseguiu obter os dois __locks__.
162+
163+
****
164+
165+
* Applying Locks
166+
+
167+
Boyarsky, Jeanne; Selikoff, Scott. OCP: Oracle Certified Professional Java SE 8 Programmer II Study Guide (p. 607). Wiley. Edição do Kindle.
168+
169+
* https://www.baeldung.com/java-concurrent-locks[Guide to java.util.concurrent.Locks.]
170+
171+
* https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/package-summary.html[Package java.util.concurrent.locks.] Java Plataform SE 8.
172+
173+
****

0 commit comments

Comments
 (0)