SlideShare uma empresa Scribd logo
1 de 46
Cópia
public static void main(String[] args) throws
CloneNotSupportedException {
Objeto meuObjeto = new Objeto();
Objeto seuObjeto = meuObjeto;
System.out.println(meuObjeto);
// resultado: br.com.douglas.Objeto@56cbfb61
System.out.println(seuObjeto);
// resultado: br.com.douglas.Objeto@56cbfb61
Objeto objetoDele = meuObjeto.clone();
System.out.println(objetoDele);
// resultado: br.com.douglas.Objeto@1134affc
}
public class Objeto implements Cloneable {
// atributos e métodos
@Override
protected Objeto clone() throws CloneNotSupportedException
{
return (Objeto) super.clone();
}
}
Mutable e
Immutable
Mutable
- É possível mudar os atributos e
estados depois que o objeto é
criado
// classe mutável
public class Pessoa {
// Campos imutáveis
private final String nome;
private final String cpf;
// Campo mutável
private EstadoCivil estadoCivil;
public Pessoa(String nome, String cpf) {
this.nome = nome;
this.cpf = cpf;
this.estadoCivil = EstadoCivil.SOLTEIRO;
}
public String getNome() { return nome; }
public String getCpf() { return cpf; }
public EstadoCivil getEstadoCivil() { return estadoCivil; }
public void setEstadoCivil(EstadoCivil estadoCivil) {
this.estadoCivil = estadoCivil;
}
}
Immutable
- Não se pode alterar os dados
depois de criado o objeto
- Objetos mais simples
- ThreadSafe
public final class Carta {
private final Integer valor;
private final Naipe naipe;
public Carta(Integer valor, Naipe naipe) {
this.valor = valor;
this.naipe = naipe;
}
public Integer getValor() {
return valor;
}
public Naipe getNaipe() {
return naipe;
}
}
Referencias
Referências, em Java, se diferenciam por como o coletor de lixo lida com elas
1. Strong Reference (Padrão)
2. Weak Reference
3. Soft Reference
4. Phantom Reference
public static void main(String[] args) {
Carro c;
// 0 objetos criados
c = new Carro();
// 1 objeto criado
c.ano = 2014;
c.nome = "Brasilia";
c = new Carro();
// 2 objetos criados - 1 inacessível
if(5>3) {
Carro c2 = new Carro();
}
// 3 objetos criados - 2 inacessíveis
Carro c3;
for (int i = 0; i < 5; i++) {
c3 = new Carro();
}
// 8 objetos criados - 6 inacessíveis
}
Strong Reference
- Padrão
- Só é elegível para ser coletado
quando o objeto passa a apontar
para null
Clazz c = new Clazz();
// StrongReference - não elegível para coleta - Clazz@2c8d66b2
c = null;
// elegível para coleta
WeakReference
- Se a JVM detectar só
WeakReferences linkadas com o
objeto, ele será marcado como
elegível para coleta
- Deve ser criado usando
java.lang.ref.WeakReference
- Objeto pode ser recuperado usando
get()
Clazz c = new Clazz();
// StrongReference - Clazz@2c8d66b2
WeakReference<Clazz> weakClazz = new
WeakReference<>(c);
c = null;
// elegível para coleta
c = weakClazz.get();
// c agora aponta para o objeto anterior - Clazz@2c8d66b2
Stack Heap
Clazz@2c8d66b2
c
weakClazz
Soft Reference
- Uma referência do tipo Soft é
elegível para coleta, mas só é
coletado se a JVM precisar de mais
memória.
- Deve ser criado usando
java.lang.ref.SoftReference
Clazz c = new Clazz();
// StrongReference - Clazz@2c8d66b2
SoftReference<Clazz> softClazz = new SoftReference<>(c);
c = null;
// elegível para coleta
c = softClazz.get();
// c agora aponta para o objeto anterior - Clazz@2c8d66b2
Phantom Reference
- Não devolve referencias (get() é
sempre null)
- Necessário o uso de uma
ReferenceQueue para receber as
referências
- Um objeto será adicionado a queue
antes de ser removido da memória
public class ClazzFinalizer extends
PhantomReference<Clazz> {
public ClazzFinalizer(Clazz referent, ReferenceQueue<?
super Clazz> q) {
super(referent, q);
}
public void finalizeResources() {
// ação de limpar
System.out.println("Limpando ...");
}
public static void main(String[] args) {
ReferenceQueue<Clazz> queue = new
ReferenceQueue<>();
Clazz c = new Clazz();
ClazzFinalizer finalizer = new ClazzFinalizer(c, queue);
System.out.println("Está na queue? " +
finalizer.isEnqueued());
c = null;
System.gc();
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Está na queue agora? " +
finalizer.isEnqueued());
Reference<? extends Clazz> clazzFromQueue =
queue.poll();
((ClazzFinalizer)clazzFromQueue).finalizeResources();
}
Exceptions
Exception x Error
Thowable
Exception Error
RuntimeException
NullPointerException IllegalStateException
VitualMachineError
StackOverflowError
IOException
SQLException
main
metodo1
metodo2
metodo3
public static void main(String[] args) {
metodo1();
}
public void metodo1() { metodo2() }
public void metodo2() { metodo3() }
main
metodo1
metodo2
Try-Catch
- Tenta executar um bloco de código
e captura a exceção, caso seja
lançada
- Pode conter um bloco finally para
ser executado ao final,
independente do lançamento da
exceção
Checked x Unchecked
Sincronizado
(ThreadSafe)
Vector
● Não é obrigado fazer
tratamento
● Erros mais simples de serem
evitados
● Herdam de RuntimeException
Verificadas pelo compilador
Checked
● Tratamento obrigatório
● Erros dificeis de serem
evitados
● Herdam diretamente de
Exception
Não são verificadas pelo
compilador
Unchecked
public static void main(String[] args) {
int x = 0;
int y = 15;
int resultado = y/x;
}
public static void main(String[] args) {
try(Banco banco = new Banco()) {
System.out.println(banco);
} catch (Exception e) {
e.printStackTrace();
}
}
Banco banco = null;
try {
banco = new Banco();
System.out.println(banco);
} catch (Exception e) {
e.printStackTrace();
} finally {
banco.close();
}
CHECKED UNCHECKED
Threads
- Uma unidade de execução em um
processo (programa)
- Permite rodar duas ou mais tarefas
ao mesmo tempo
- Podem ser executados de forma
concorrente ou paralela
Processo
Thread
Processo
Thread
Thread
Thread
Concorrente x Paralelo
#1
#2
#1
#2
#1
#1 #2
Caracteristicas
- Não possui ordem de execução
- Cada thread possui seu próprio
contador de programa, pilha e
variáveis locais
- Compartilha a memória do processo
em que está sendo executado
public class ServidorTarefas {
private final ServerSocket servidor;
private final ExecutorService threadPool;
private AtomicBoolean estaRodando;
private BlockingQueue<String> filaDeComandos;
/** Constructor */
public ServidorTarefas() throws IOException {
System.out.println(" ---- Iniciando servidor ---- ");
servidor = new ServerSocket(12345);
threadPool =
Executors.newCachedThreadPool(new
FabricaDeThreads());
this.estaRodando = new AtomicBoolean(true);
this.filaDeComandos = new
ArrayBlockingQueue<>(2);
incializarConsumidores(2);
}
public static void main(String[] args) throws
IOException {
ServidorTarefas servidor = new ServidorTarefas();
servidor.rodar();
servidor.desliga();
}
public void desliga() throws IOException {
this.estaRodando.set(false);
servidor.close();
threadPool.shutdown();
}
public void rodar() throws IOException {
while(estaRodando.get()) {
try {
Socket socket = servidor.accept();
System.out.println("Aceitando novo cliente na porta " +
socket.getPort());
DistribuirTarefas distribuirTarefas = new
DistribuirTarefas(threadPool, filaDeComandos, socket, this);
threadPool.execute(distribuirTarefas);
} catch (SocketException e) {
System.out.println("O servidor desligará depois que todos os
clientes desconectarem.");
}
}
}
private void incializarConsumidores(int numConsumidores) {
for (int i = 0; i < numConsumidores; i++) {
TarefaConsumir tarefa = new TarefaConsumir(filaDeComandos);
this.threadPool.execute(tarefa);
}
}
public class ClienteTarefas {
public static void main(String[] args) throws Exception {
Socket socket = criaConexao();
PrintStream saida = new
PrintStream(socket.getOutputStream());
// ***** Execução das threads *****
Thread threadDeSaida = criaThreadDeSaida(socket, saida);
threadDeSaida.start();
criaEExecutaThreadDeEntrada(socket);
threadDeSaida.join();
socket.close();
}
private static Socket criaConexao() throws IOException {
Socket socket = new Socket("localhost",12345);
System.out.println("Conexão estabelecida n Pode enviar
comandos!");
return socket;
}
private static Thread criaThreadDeSaida(Socket socket,
PrintStream saida) {
return new Thread(() -> executaComandosNoServidor(socket,
saida), "ThreadDeSaida");
}
private static void imprimeRespostaDoServidor(Socket socket) {
try {
Scanner respostaServidor = new
Scanner(socket.getInputStream());
while(respostaServidor.hasNextLine()){
System.out.println(respostaServidor.nextLine());
}
} catch (Exception e) {
System.out.println("IOException: " + e.getMessage());
}
}
private static void executaComandosNoServidor(Socket socket, PrintStream saida) {
pegaInputEPrinta(saida);
saida.println("Encerrando o cliente " + socket);
saida.close();
}
private static void pegaInputEPrinta(PrintStream saida) {
Scanner teclado = new Scanner(System.in);
while(teclado.hasNextLine()) {
String linha = teclado.nextLine();
if (ehComandoVazio(linha)) break;
saida.println(linha);
}
}
private static boolean ehComandoVazio(String linha) {
return (linha.trim().equals(""));
}
private static void criaEExecutaThreadDeEntrada(Socket socket) {
Thread threadEntrada = new Thread(() -> imprimeRespostaDoServidor(socket), "ThreadDeEntrada");
threadEntrada.start();
}
Synchronized
- Permite controlar o fluxo (só uma
thread tem acesso ao método)
- Se uma segunda thread tenta
acessar o método, terá que esperar
que a primeira termine
public synchronized void remove() {
// executa remoção de alguma coisa
}
synchronized (this) {
// faz alguma coisa
}
Semaphore
- Permite controlar o acesso a algum
recurso através de um contador
- Podemos determinar quantos locks
queremos disponibilizar
- Se todos os locks estão ocupados, a
thread é bloqueada e espera a
liberação de algum lock
- Após a execução da thread, o lock é
liberado para a próxima thread
public class TesteSemaphore {
Semaphore semaphore = new Semaphore(3);
public void run() {
try {
System.out.println("Adquirindo lock");
System.out.println("Permits restantes: " +
semaphore.availablePermits());
semaphore.acquire();
System.out.println("Permit adquirido");
try {
// Fazendo alguma coisa complexa
// e capturando a exceção que possa ser
lançada
} finally {
System.out.println("Liberando lock ...");
semaphore.release();
System.out.println("Permits disponíveis: " +
semaphore.availablePermits());
} catch (InterruptedException e) {
System.out.println("Deu ruim");
}
}
Estruturas de Dados
Array (Vetor)
- Declaração de Arrays:
“Uma coleção sequencial, de tamanho fixo, que guarda elementos do mesmo tipo”
int[] numeros = new int[10]; -> Cria um array de 10 inteiros
LoremIpsum
15
7
9
23
4
35
0
8
42
18
LoremIpsum
0
0
0
0
0
0
0
0
0
0
numeros[0] = 42;
numeros[1] = 18;
numeros[2] = 4;
numeros[3] = 35;
numeros[4] = 0;
numeros[5] = 8;
numeros[6] = 15;
numeros[7] = 7;
numeros[8] = 9;
numeros[9] = 23;
Implementações de List:
1. ArrayList
2. Vector
1. Stack
3. LinkedList:
1. SinglyLinkedList (SLL)
2. DoublyLinkedList(DLL)
Listas (java.util.List)
“Uma sequencia ordenada de objetos”
ArrayList - Vector
- Recebe itens repetidos
- Usa um Array para organizar e armazenar os dados
- Consultas rápidas mas inserções/remoções lentas
- Aumenta e diminui dinamicamente para manter a otimização de dados
Sincronizado
(ThreadSafe)
Vector
● Dobra o tamanho da lista caso
todos os espaços sejam
preenchidos
● + Lento
● JDK 1.0
Não sincronizado
(ThreadUnsafe)
ArrayList
● Aumenta 50% do tamanho da
lista caso todos os espaços
sejam preenchidos
● + Rápido
● JDK 1.2
Sincronizado
(ThreadSafe)
Vector
Stack (Pilha)
- LIFO (Last-in-First-Out)
- Não é possível adicionar ou remover a partir de um index
- Sempre recebemos o ultimo item adicionado
#1
#2
#3
#4
#5
push(E e)
#1
#2
#3
#4
pop()
#5
#1
#2
#3
#4
peek()
#4
Queue(Interface)
- FIFO (First-in-First-Out)
- Não é possível adicionar/remover a partir de um index
- Sempre recebemos o primeiro item adicionado
- Geralmente criada usando uma LinkedList
- Queue<String> fila = new LinkedList<>();
#3
#2
#1
#4
offer(E
e)
#3
#2
#1
pop()
remove()
#3
#2
#1
peek()
#1
add(E e)
LinkedLists
- Usa referências para organizar a ordem
- Rápidas inserções mas lentas consultas
- Aumenta e diminui dinamicamente para manter a otimização de dados
- ThreadUnsafe
SLL x DLL
Celula Celula Celula
CelulaCelulaCelula
Celula Celula Celula
Celula Celula Celula
CelulaCelulaCelula
Celula Celula Celula
Sincronizado
(ThreadSafe)
Vector
● Usa 2 links de referência (anterior
e próxima)
● Ocupa mais espaço na memória
● Acesso aos elementos mais
eficiente
SLL
● Usa só um link de referência
(próxima celula)
● Ocupa menos espaço na
memória
● Acesso aos elementos menos
eficiente
DLL
Dados Link Dados LinkLink
Set (Interface)
- Não podem conter itens repetidos
- Implementação mais usada: HashSet
- Não é possível adquirir um item a partir de um index.
- Para recuperar algum elemento, é necessário usar um Iterator (ou um foreach, a partir
do Java 5)
Set<Aluno> set = new HashSet<>();
Aluno douglas = new Aluno("Douglas", 3729);
Aluno mauricio = new Aluno("Mauricio", 2587);
Aluno isadora = new Aluno("Isadora", 3652);
set.add(mauricio);
set.add(douglas);
set.add(douglas);
set.add(isadora);
System.out.println("************ Usando foreach ************");
for (Aluno aluno : set) {
System.out.println(aluno.getNome());
}
System.out.println("************ Usando metodo foreach() ************");
set.forEach(aluno -> {
System.out.println(aluno.getNome());
});
System.out.println("************ Usando iterator ************");
Iterator<Aluno> iterator = set.iterator();
while (iterator.hasNext()) {
Aluno aluno = iterator.next();
System.out.println(aluno.getNome());
}
Map (Interface)
Mapeia valores para suas chaves
#1
#2
#3
Chave Valor
x
z
y
HashMap
- Usa um algoritmo de espalhamento
- Rápidas consultas e inserções
Implementação mais usada da interface Map
Aluno(Chave)
José Maria João
Matricula(Valores
)
369 ...
123
258

Mais conteúdo relacionado

Mais procurados

Threads 04 Variáveis atômicas
Threads 04 Variáveis atômicasThreads 04 Variáveis atômicas
Threads 04 Variáveis atômicasHelder da Rocha
 
Threads 06: Coleções concorrentes
Threads 06: Coleções concorrentesThreads 06: Coleções concorrentes
Threads 06: Coleções concorrentesHelder da Rocha
 
A Classe StringBuilder em Java
A Classe StringBuilder em JavaA Classe StringBuilder em Java
A Classe StringBuilder em JavaDevmedia
 
Excecoes
ExcecoesExcecoes
ExcecoesEMSNEWS
 
Como ser programador durante o dia e mesmo assim dormir bem à noite
Como ser programador durante o dia e mesmo assim dormir bem à noiteComo ser programador durante o dia e mesmo assim dormir bem à noite
Como ser programador durante o dia e mesmo assim dormir bem à noiteComunidade NetPonto
 
Curso de Java: Introdução a lambda e Streams
Curso de Java: Introdução a lambda e StreamsCurso de Java: Introdução a lambda e Streams
Curso de Java: Introdução a lambda e StreamsHelder da Rocha
 
Atualização Java 8 (2014)
Atualização Java 8 (2014)Atualização Java 8 (2014)
Atualização Java 8 (2014)Helder da Rocha
 
Introdução a JPA (2010)
Introdução a JPA (2010)Introdução a JPA (2010)
Introdução a JPA (2010)Helder da Rocha
 
Programação Desktop: Revisão Core Java
Programação Desktop: Revisão Core JavaProgramação Desktop: Revisão Core Java
Programação Desktop: Revisão Core JavaElaine Cecília Gatto
 
Utilitários para Programação Concorrente em Java (2005)
Utilitários para Programação Concorrente em Java (2005)Utilitários para Programação Concorrente em Java (2005)
Utilitários para Programação Concorrente em Java (2005)Helder da Rocha
 
Java orientação a objetos (variaveis de instancia e metodos)
Java   orientação a objetos (variaveis de instancia e metodos)Java   orientação a objetos (variaveis de instancia e metodos)
Java orientação a objetos (variaveis de instancia e metodos)Armando Daniel
 
Testes em Aplicações Web com Cactus
Testes em Aplicações Web com CactusTestes em Aplicações Web com Cactus
Testes em Aplicações Web com CactusDenis L Presciliano
 
[Curso Java Basico - Exceptions] Aula 48: multiplos catch
[Curso Java Basico - Exceptions] Aula 48: multiplos catch[Curso Java Basico - Exceptions] Aula 48: multiplos catch
[Curso Java Basico - Exceptions] Aula 48: multiplos catchLoiane Groner
 

Mais procurados (20)

Threads 04 Variáveis atômicas
Threads 04 Variáveis atômicasThreads 04 Variáveis atômicas
Threads 04 Variáveis atômicas
 
Threads 09: Paralelismo
Threads 09: ParalelismoThreads 09: Paralelismo
Threads 09: Paralelismo
 
Threads 06: Coleções concorrentes
Threads 06: Coleções concorrentesThreads 06: Coleções concorrentes
Threads 06: Coleções concorrentes
 
A Classe StringBuilder em Java
A Classe StringBuilder em JavaA Classe StringBuilder em Java
A Classe StringBuilder em Java
 
Java hidden features
Java hidden featuresJava hidden features
Java hidden features
 
Evento CODERS
Evento CODERSEvento CODERS
Evento CODERS
 
Excecoes
ExcecoesExcecoes
Excecoes
 
Event-based Asynchronous Pattern (EAP)
Event-based Asynchronous Pattern (EAP)Event-based Asynchronous Pattern (EAP)
Event-based Asynchronous Pattern (EAP)
 
Como ser programador durante o dia e mesmo assim dormir bem à noite
Como ser programador durante o dia e mesmo assim dormir bem à noiteComo ser programador durante o dia e mesmo assim dormir bem à noite
Como ser programador durante o dia e mesmo assim dormir bem à noite
 
Curso de Java: Introdução a lambda e Streams
Curso de Java: Introdução a lambda e StreamsCurso de Java: Introdução a lambda e Streams
Curso de Java: Introdução a lambda e Streams
 
Atualização Java 8 (2014)
Atualização Java 8 (2014)Atualização Java 8 (2014)
Atualização Java 8 (2014)
 
Padrão Command
Padrão CommandPadrão Command
Padrão Command
 
Java hidden features
Java hidden featuresJava hidden features
Java hidden features
 
Javascript
JavascriptJavascript
Javascript
 
Introdução a JPA (2010)
Introdução a JPA (2010)Introdução a JPA (2010)
Introdução a JPA (2010)
 
Programação Desktop: Revisão Core Java
Programação Desktop: Revisão Core JavaProgramação Desktop: Revisão Core Java
Programação Desktop: Revisão Core Java
 
Utilitários para Programação Concorrente em Java (2005)
Utilitários para Programação Concorrente em Java (2005)Utilitários para Programação Concorrente em Java (2005)
Utilitários para Programação Concorrente em Java (2005)
 
Java orientação a objetos (variaveis de instancia e metodos)
Java   orientação a objetos (variaveis de instancia e metodos)Java   orientação a objetos (variaveis de instancia e metodos)
Java orientação a objetos (variaveis de instancia e metodos)
 
Testes em Aplicações Web com Cactus
Testes em Aplicações Web com CactusTestes em Aplicações Web com Cactus
Testes em Aplicações Web com Cactus
 
[Curso Java Basico - Exceptions] Aula 48: multiplos catch
[Curso Java Basico - Exceptions] Aula 48: multiplos catch[Curso Java Basico - Exceptions] Aula 48: multiplos catch
[Curso Java Basico - Exceptions] Aula 48: multiplos catch
 

Semelhante a Clone, Referências e Threads em Java

Semelhante a Clone, Referências e Threads em Java (20)

Threads 01: Criação e controle de threads
Threads 01: Criação e controle de threadsThreads 01: Criação e controle de threads
Threads 01: Criação e controle de threads
 
Como criar classes e objetos
Como criar classes e objetosComo criar classes e objetos
Como criar classes e objetos
 
Como criar classes e objetos
Como criar classes e objetosComo criar classes e objetos
Como criar classes e objetos
 
Threads 05: Travas de Exclusão Mútua
Threads 05: Travas de Exclusão MútuaThreads 05: Travas de Exclusão Mútua
Threads 05: Travas de Exclusão Mútua
 
PHP fora da Web
PHP fora da WebPHP fora da Web
PHP fora da Web
 
Java 13 Excecoes
Java 13 ExcecoesJava 13 Excecoes
Java 13 Excecoes
 
Power mock
Power mockPower mock
Power mock
 
Java 06
Java 06Java 06
Java 06
 
Fundamentos de Sockets
Fundamentos de SocketsFundamentos de Sockets
Fundamentos de Sockets
 
Fundamentos de Sockets
Fundamentos de SocketsFundamentos de Sockets
Fundamentos de Sockets
 
Curso java 01 - molhando os pés com java
Curso java   01 - molhando os pés com javaCurso java   01 - molhando os pés com java
Curso java 01 - molhando os pés com java
 
Introdução à programação em Android e iOS - OOP em ObjC
Introdução à programação em Android e iOS - OOP em ObjCIntrodução à programação em Android e iOS - OOP em ObjC
Introdução à programação em Android e iOS - OOP em ObjC
 
Threads
ThreadsThreads
Threads
 
Mobileconf dicas-android
Mobileconf dicas-androidMobileconf dicas-android
Mobileconf dicas-android
 
Java 13
Java 13Java 13
Java 13
 
Funcamentos de Programação Concorrente
Funcamentos de Programação ConcorrenteFuncamentos de Programação Concorrente
Funcamentos de Programação Concorrente
 
Javascript Ilegível
Javascript IlegívelJavascript Ilegível
Javascript Ilegível
 
Git, GitHub e OO
Git, GitHub e OOGit, GitHub e OO
Git, GitHub e OO
 
java_avancado.pdf
java_avancado.pdfjava_avancado.pdf
java_avancado.pdf
 
Design patterns
Design patternsDesign patterns
Design patterns
 

Clone, Referências e Threads em Java

  • 2. public static void main(String[] args) throws CloneNotSupportedException { Objeto meuObjeto = new Objeto(); Objeto seuObjeto = meuObjeto; System.out.println(meuObjeto); // resultado: br.com.douglas.Objeto@56cbfb61 System.out.println(seuObjeto); // resultado: br.com.douglas.Objeto@56cbfb61 Objeto objetoDele = meuObjeto.clone(); System.out.println(objetoDele); // resultado: br.com.douglas.Objeto@1134affc } public class Objeto implements Cloneable { // atributos e métodos @Override protected Objeto clone() throws CloneNotSupportedException { return (Objeto) super.clone(); } }
  • 4. Mutable - É possível mudar os atributos e estados depois que o objeto é criado // classe mutável public class Pessoa { // Campos imutáveis private final String nome; private final String cpf; // Campo mutável private EstadoCivil estadoCivil; public Pessoa(String nome, String cpf) { this.nome = nome; this.cpf = cpf; this.estadoCivil = EstadoCivil.SOLTEIRO; } public String getNome() { return nome; } public String getCpf() { return cpf; } public EstadoCivil getEstadoCivil() { return estadoCivil; } public void setEstadoCivil(EstadoCivil estadoCivil) { this.estadoCivil = estadoCivil; } }
  • 5. Immutable - Não se pode alterar os dados depois de criado o objeto - Objetos mais simples - ThreadSafe public final class Carta { private final Integer valor; private final Naipe naipe; public Carta(Integer valor, Naipe naipe) { this.valor = valor; this.naipe = naipe; } public Integer getValor() { return valor; } public Naipe getNaipe() { return naipe; } }
  • 7. Referências, em Java, se diferenciam por como o coletor de lixo lida com elas 1. Strong Reference (Padrão) 2. Weak Reference 3. Soft Reference 4. Phantom Reference
  • 8. public static void main(String[] args) { Carro c; // 0 objetos criados c = new Carro(); // 1 objeto criado c.ano = 2014; c.nome = "Brasilia"; c = new Carro(); // 2 objetos criados - 1 inacessível if(5>3) { Carro c2 = new Carro(); } // 3 objetos criados - 2 inacessíveis Carro c3; for (int i = 0; i < 5; i++) { c3 = new Carro(); } // 8 objetos criados - 6 inacessíveis }
  • 9. Strong Reference - Padrão - Só é elegível para ser coletado quando o objeto passa a apontar para null Clazz c = new Clazz(); // StrongReference - não elegível para coleta - Clazz@2c8d66b2 c = null; // elegível para coleta
  • 10. WeakReference - Se a JVM detectar só WeakReferences linkadas com o objeto, ele será marcado como elegível para coleta - Deve ser criado usando java.lang.ref.WeakReference - Objeto pode ser recuperado usando get() Clazz c = new Clazz(); // StrongReference - Clazz@2c8d66b2 WeakReference<Clazz> weakClazz = new WeakReference<>(c); c = null; // elegível para coleta c = weakClazz.get(); // c agora aponta para o objeto anterior - Clazz@2c8d66b2 Stack Heap Clazz@2c8d66b2 c weakClazz
  • 11. Soft Reference - Uma referência do tipo Soft é elegível para coleta, mas só é coletado se a JVM precisar de mais memória. - Deve ser criado usando java.lang.ref.SoftReference Clazz c = new Clazz(); // StrongReference - Clazz@2c8d66b2 SoftReference<Clazz> softClazz = new SoftReference<>(c); c = null; // elegível para coleta c = softClazz.get(); // c agora aponta para o objeto anterior - Clazz@2c8d66b2
  • 12. Phantom Reference - Não devolve referencias (get() é sempre null) - Necessário o uso de uma ReferenceQueue para receber as referências - Um objeto será adicionado a queue antes de ser removido da memória public class ClazzFinalizer extends PhantomReference<Clazz> { public ClazzFinalizer(Clazz referent, ReferenceQueue<? super Clazz> q) { super(referent, q); } public void finalizeResources() { // ação de limpar System.out.println("Limpando ..."); }
  • 13. public static void main(String[] args) { ReferenceQueue<Clazz> queue = new ReferenceQueue<>(); Clazz c = new Clazz(); ClazzFinalizer finalizer = new ClazzFinalizer(c, queue); System.out.println("Está na queue? " + finalizer.isEnqueued()); c = null; System.gc(); try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Está na queue agora? " + finalizer.isEnqueued()); Reference<? extends Clazz> clazzFromQueue = queue.poll(); ((ClazzFinalizer)clazzFromQueue).finalizeResources(); }
  • 15. Exception x Error Thowable Exception Error RuntimeException NullPointerException IllegalStateException VitualMachineError StackOverflowError IOException SQLException
  • 16. main metodo1 metodo2 metodo3 public static void main(String[] args) { metodo1(); } public void metodo1() { metodo2() } public void metodo2() { metodo3() } main metodo1 metodo2
  • 17. Try-Catch - Tenta executar um bloco de código e captura a exceção, caso seja lançada - Pode conter um bloco finally para ser executado ao final, independente do lançamento da exceção
  • 18. Checked x Unchecked Sincronizado (ThreadSafe) Vector ● Não é obrigado fazer tratamento ● Erros mais simples de serem evitados ● Herdam de RuntimeException Verificadas pelo compilador Checked ● Tratamento obrigatório ● Erros dificeis de serem evitados ● Herdam diretamente de Exception Não são verificadas pelo compilador Unchecked
  • 19. public static void main(String[] args) { int x = 0; int y = 15; int resultado = y/x; } public static void main(String[] args) { try(Banco banco = new Banco()) { System.out.println(banco); } catch (Exception e) { e.printStackTrace(); } } Banco banco = null; try { banco = new Banco(); System.out.println(banco); } catch (Exception e) { e.printStackTrace(); } finally { banco.close(); } CHECKED UNCHECKED
  • 21. - Uma unidade de execução em um processo (programa) - Permite rodar duas ou mais tarefas ao mesmo tempo - Podem ser executados de forma concorrente ou paralela Processo Thread Processo Thread Thread Thread
  • 23. Caracteristicas - Não possui ordem de execução - Cada thread possui seu próprio contador de programa, pilha e variáveis locais - Compartilha a memória do processo em que está sendo executado
  • 24. public class ServidorTarefas { private final ServerSocket servidor; private final ExecutorService threadPool; private AtomicBoolean estaRodando; private BlockingQueue<String> filaDeComandos; /** Constructor */ public ServidorTarefas() throws IOException { System.out.println(" ---- Iniciando servidor ---- "); servidor = new ServerSocket(12345); threadPool = Executors.newCachedThreadPool(new FabricaDeThreads()); this.estaRodando = new AtomicBoolean(true); this.filaDeComandos = new ArrayBlockingQueue<>(2); incializarConsumidores(2); } public static void main(String[] args) throws IOException { ServidorTarefas servidor = new ServidorTarefas(); servidor.rodar(); servidor.desliga(); } public void desliga() throws IOException { this.estaRodando.set(false); servidor.close(); threadPool.shutdown(); } public void rodar() throws IOException { while(estaRodando.get()) { try { Socket socket = servidor.accept(); System.out.println("Aceitando novo cliente na porta " + socket.getPort()); DistribuirTarefas distribuirTarefas = new DistribuirTarefas(threadPool, filaDeComandos, socket, this); threadPool.execute(distribuirTarefas); } catch (SocketException e) { System.out.println("O servidor desligará depois que todos os clientes desconectarem."); } } } private void incializarConsumidores(int numConsumidores) { for (int i = 0; i < numConsumidores; i++) { TarefaConsumir tarefa = new TarefaConsumir(filaDeComandos); this.threadPool.execute(tarefa); } }
  • 25. public class ClienteTarefas { public static void main(String[] args) throws Exception { Socket socket = criaConexao(); PrintStream saida = new PrintStream(socket.getOutputStream()); // ***** Execução das threads ***** Thread threadDeSaida = criaThreadDeSaida(socket, saida); threadDeSaida.start(); criaEExecutaThreadDeEntrada(socket); threadDeSaida.join(); socket.close(); } private static Socket criaConexao() throws IOException { Socket socket = new Socket("localhost",12345); System.out.println("Conexão estabelecida n Pode enviar comandos!"); return socket; } private static Thread criaThreadDeSaida(Socket socket, PrintStream saida) { return new Thread(() -> executaComandosNoServidor(socket, saida), "ThreadDeSaida"); } private static void imprimeRespostaDoServidor(Socket socket) { try { Scanner respostaServidor = new Scanner(socket.getInputStream()); while(respostaServidor.hasNextLine()){ System.out.println(respostaServidor.nextLine()); } } catch (Exception e) { System.out.println("IOException: " + e.getMessage()); } }
  • 26. private static void executaComandosNoServidor(Socket socket, PrintStream saida) { pegaInputEPrinta(saida); saida.println("Encerrando o cliente " + socket); saida.close(); } private static void pegaInputEPrinta(PrintStream saida) { Scanner teclado = new Scanner(System.in); while(teclado.hasNextLine()) { String linha = teclado.nextLine(); if (ehComandoVazio(linha)) break; saida.println(linha); } } private static boolean ehComandoVazio(String linha) { return (linha.trim().equals("")); } private static void criaEExecutaThreadDeEntrada(Socket socket) { Thread threadEntrada = new Thread(() -> imprimeRespostaDoServidor(socket), "ThreadDeEntrada"); threadEntrada.start(); }
  • 27. Synchronized - Permite controlar o fluxo (só uma thread tem acesso ao método) - Se uma segunda thread tenta acessar o método, terá que esperar que a primeira termine public synchronized void remove() { // executa remoção de alguma coisa } synchronized (this) { // faz alguma coisa }
  • 28. Semaphore - Permite controlar o acesso a algum recurso através de um contador - Podemos determinar quantos locks queremos disponibilizar - Se todos os locks estão ocupados, a thread é bloqueada e espera a liberação de algum lock - Após a execução da thread, o lock é liberado para a próxima thread public class TesteSemaphore { Semaphore semaphore = new Semaphore(3); public void run() { try { System.out.println("Adquirindo lock"); System.out.println("Permits restantes: " + semaphore.availablePermits()); semaphore.acquire(); System.out.println("Permit adquirido"); try { // Fazendo alguma coisa complexa // e capturando a exceção que possa ser lançada } finally { System.out.println("Liberando lock ..."); semaphore.release(); System.out.println("Permits disponíveis: " + semaphore.availablePermits()); } catch (InterruptedException e) { System.out.println("Deu ruim"); } }
  • 30. Array (Vetor) - Declaração de Arrays: “Uma coleção sequencial, de tamanho fixo, que guarda elementos do mesmo tipo” int[] numeros = new int[10]; -> Cria um array de 10 inteiros LoremIpsum 15 7 9 23 4 35 0 8 42 18 LoremIpsum 0 0 0 0 0 0 0 0 0 0 numeros[0] = 42; numeros[1] = 18; numeros[2] = 4; numeros[3] = 35; numeros[4] = 0; numeros[5] = 8; numeros[6] = 15; numeros[7] = 7; numeros[8] = 9; numeros[9] = 23;
  • 31. Implementações de List: 1. ArrayList 2. Vector 1. Stack 3. LinkedList: 1. SinglyLinkedList (SLL) 2. DoublyLinkedList(DLL) Listas (java.util.List) “Uma sequencia ordenada de objetos”
  • 32. ArrayList - Vector - Recebe itens repetidos - Usa um Array para organizar e armazenar os dados - Consultas rápidas mas inserções/remoções lentas - Aumenta e diminui dinamicamente para manter a otimização de dados
  • 33. Sincronizado (ThreadSafe) Vector ● Dobra o tamanho da lista caso todos os espaços sejam preenchidos ● + Lento ● JDK 1.0 Não sincronizado (ThreadUnsafe) ArrayList ● Aumenta 50% do tamanho da lista caso todos os espaços sejam preenchidos ● + Rápido ● JDK 1.2 Sincronizado (ThreadSafe) Vector
  • 34. Stack (Pilha) - LIFO (Last-in-First-Out) - Não é possível adicionar ou remover a partir de um index - Sempre recebemos o ultimo item adicionado
  • 36. Queue(Interface) - FIFO (First-in-First-Out) - Não é possível adicionar/remover a partir de um index - Sempre recebemos o primeiro item adicionado - Geralmente criada usando uma LinkedList - Queue<String> fila = new LinkedList<>();
  • 38. LinkedLists - Usa referências para organizar a ordem - Rápidas inserções mas lentas consultas - Aumenta e diminui dinamicamente para manter a otimização de dados - ThreadUnsafe
  • 39. SLL x DLL Celula Celula Celula CelulaCelulaCelula Celula Celula Celula Celula Celula Celula CelulaCelulaCelula Celula Celula Celula
  • 40. Sincronizado (ThreadSafe) Vector ● Usa 2 links de referência (anterior e próxima) ● Ocupa mais espaço na memória ● Acesso aos elementos mais eficiente SLL ● Usa só um link de referência (próxima celula) ● Ocupa menos espaço na memória ● Acesso aos elementos menos eficiente DLL Dados Link Dados LinkLink
  • 41. Set (Interface) - Não podem conter itens repetidos - Implementação mais usada: HashSet - Não é possível adquirir um item a partir de um index. - Para recuperar algum elemento, é necessário usar um Iterator (ou um foreach, a partir do Java 5)
  • 42. Set<Aluno> set = new HashSet<>(); Aluno douglas = new Aluno("Douglas", 3729); Aluno mauricio = new Aluno("Mauricio", 2587); Aluno isadora = new Aluno("Isadora", 3652); set.add(mauricio); set.add(douglas); set.add(douglas); set.add(isadora); System.out.println("************ Usando foreach ************"); for (Aluno aluno : set) { System.out.println(aluno.getNome()); } System.out.println("************ Usando metodo foreach() ************"); set.forEach(aluno -> { System.out.println(aluno.getNome()); }); System.out.println("************ Usando iterator ************"); Iterator<Aluno> iterator = set.iterator(); while (iterator.hasNext()) { Aluno aluno = iterator.next(); System.out.println(aluno.getNome()); }
  • 43. Map (Interface) Mapeia valores para suas chaves
  • 45. HashMap - Usa um algoritmo de espalhamento - Rápidas consultas e inserções Implementação mais usada da interface Map

Notas do Editor

  1. WeakHashMap - Se a chave for coletada pelo GC, o registro tb vai ser apagado Usada em RealTimeApplications Conexões com DB
  2. Criar caches que não arriscam quebrar a aplicação por uso de memória
  3. Notificação quando um objeto é limpado da memória Evitar o uso do finalize() - depricated
  4. Error -> Erros muito graves, mais para quem lida com a JVM
  5. Finally: Fechar conexão com o banco, por exemplo
  6. Concorrente - Intercalado rapidamente de forma com que parece paralelo Paralelo - Processador com varios nucleos, threads são executadas ao mesmo tempo
  7. Ordem é dada pelo escalonador Falar de como exceções funcionam em threads Contador de programa - Indica a posição atual na sequencia de execução de um processo Pilha de execução - Armazena informações de sub-rotinas
  8. Lock
  9. Capacidade inicial - 10
  10. Capacidade inicial - 10
  11. Deque (Double-Ended Queue) - Pode ser retirado um objeto tanto do começo quanto do fim ArrayDeque
  12. Add e Remove lançam exceções