Publicado em Java Effective

Concorrência – Item 71

metro-dfUse a inicialização preguiçosa criteriosamente

Inicialização preguiçosa é uma otimização que pode ser uma faca de dois gumes. Ela diminui o custo de inicialização, mas aumenta o custo de acesso. Dependendo da parcela de campos, do custo de inicialização e da frequência de acesso, ela pode (como qualquer outra prática de otimização) acabar prejudicando o desempenho. A única forma de realmente saber é avaliando o desempenho com e sem a inicialização preguiçosa. Portanto, prefira inicializar os campos normalmente e não preguiçosamente. Se tiver que optar pela inicialização preguiçosa para atingir seus objetos de desempenho ou para romper a circularidade de inicialização prejudicial, use a adequada técnica de acordo como o seu caso:

  • Para campos de instâncias use o idioma de “verificação repetida”.
  • Para campos estáticos use o idioma de “classe possuidora”.
  • Para campos de instâncias que tolerem inicialização repetida, use o idioma de “verificação única”.

Para todas as informações, veja o post inicial.

“Se você disser com a sua boca: ‘Jesus é Senhor’ e no seu coração crer que Deus ressuscitou Jesus, você será salvo. Porque nós cremos com o coração e somos aceitos por Deus; falamos com a boca e assim somos salvos. Romanos 10:9-10

Publicado em Java Effective

Concorrência – Item 70

imagesDocumente a garantia de execução concorrente

A maneira de como uma classe se comporta quando suas instâncias ou métodos estáticos estão sujeitos a uso concorrente é parte importante do contrato que a classe firma com seus clientes. Se isso não for documentado, os programadores clientes serão forçados as fazer suposições que se estiverem erradas resulte em sincronização insuficiente (Item 66) ou excessiva (Item 67) ambos erros graves.  Portanto toda classe deve documentar claramente suas propriedades de garantias de execuções (Imutável, Garantia Incondicional, Garantia Condicional e Sem Garantia) cuidadosamente em prosa ou em anotação @Imutable, @ThreadSafe ou @NotThreadSafe como indicado pelo livro Java Concorrente na Prática.

Para todas as informações, veja o post inicial.

“Portanto, obedeçam a Deus e enfrentem o Diabo, que ele fugirá de vocês.” Tiago 4:7

Publicado em Java Effective

Concorrência – Item 69

pista-wgp-londres-carros-5170-yellow-23187-MLB20242118419_022015-OPrefira utilitários de concorrência a wait() e notify()

A partir do lançamento da versão 5, a plataforma Java fornece utilitários de concorrência de nível mais alto (java.util.concurrent) oferecendo inúmeras facilidades que antes os programadores tinham que gerenciar manualmente. Veja http://docs.oracle.com/javase/tutorial/essential/concurrency/index.html .

Portanto, não é mais indicado a coordenação manual de threads usando os métodos wait(), notify() e notifyAll(). O mecanismo preferível de uso são os novos sincronizadores de nível superior, que possui uma série de facilidades. Consulte a documentação para todas as informações.

Para todas as informações, veja o post inicial.

“E tudo o que vocês fizerem ou disserem, façam em nome do Senhor Jesus e por meio dele agradeçam a Deus, o Pai.” Colossenses 3:17

Publicado em Java Effective

Concorrência – Item 68

downloadPrefira executores e tarefas a thread

A partir do lançamento da versão 5, a plataforma Java fornece utilitários de concorrência de nível mais alto (java.util.concurrent) oferecendo inúmeras facilidades que antes os programadores tinham que gerenciar manualmente. Veja http://docs.oracle.com/javase/tutorial/essential/concurrency/index.html

A principal abstração que servia tanto de unidade de trabalho quanto mecanismo de execução conhecido como Thread foi separado em duas vertentes – Runnable e Callable. Portanto, não é mais indicado à criação manual de threads e principalmente de grupos lógicos de threads (pooling). O mecanismo preferível para criar e executar tarefas em paralelos é o ExecutorService que possui uma série de facilidades e otimizações. Consulte a documentação para todas as informações – http://docs.oracle.com/javase/tutorial/essential/concurrency/executors.html.

Para todas as informações, veja o post inicial.

“A pessoa faz os seus planos, mas quem dirige a sua vida é Deus, o SENHOR.” Provérbios 16:9

Publicado em Java Effective

Concorrência – Item 67

AUTORAMAS-E-SLOT-CAR-105228_imageEvite a sincronização excessiva

Na moderna era multicore, o custo real da sincronização excessiva não é o tempo de CPU gasto na obtenção e liberação de bloqueios. São na verdade as oportunidades de paralelismo perdidos, os atrasos impostos pela necessidade de assegurar que cada núcleo tenha uma visão consistente de memória e a limitação resultante que impede uma JVM de otimizar tais execuções de códigos. Portanto, sempre tente reduzir ao máximo o volume de código executado dentro de regiões sincronizadas. Parar evitar falhar de atividades e de segurança, nunca faça chamadas polimórficas dentro de blocos sincronizados. Ao projetar uma classe, pondere se existe uma boa razão para ela executar sua própria sincronização interna ou deixar com que o chamador se encarregue disso. Sempre documente tais situações no Java Doc.

Para todas as informações, veja o post inicial.

Para ter sabedoria, é preciso primeiro pagar o seu preço. Use tudo o que você tem para conseguir a compreensão. Provérbios 4:7

Publicado em Java Effective

Java Effective – Aprenda a programar em Java

51+QT0CAoEL._SX384_BO1,204,203,200_Se você já estudou um segundo idioma e tentou usa-lo fora da sala de aula, sabe que ha três coisas que você deve dominar: como o idioma é estruturado (gramática), como nomear as coisas ass quais se deseja falar (vocábulo) e as maneiras costumeiras e efetivas de dizer coisas cotidianas (modo de uso). Com frequência só as primeiras duas são abordadas na sala de aula e é comum vermos pessoas que nasceram falando o idioma escondendo risinhos quando tentamos nos fazer compreender.

Tudo isso é semelhante com a linguagem de programação Java. Você tem que entender a gramática: fundamentos da linguagem, se ela é algorítmica, funcional, orientada a objetos? Tem que conhecer o vocábulo: que dados, estruturas, operações e recursos são fornecidos pelas bibliotecas padrão? E precisa estar familiarizado o modo de uso: quais as maneiras costumeiras e efetivas de estruturar o código? Geralmente os livros sobre linguagem de programação Java abordam somente a gramática e o vocábulo, deixando o modo de uso totalmente a parte.

Este livro tem o objetivo exclusivo de ensinar a terceira necessidade, o uso costumeiro e efetivo da linguagem Java. Pelo que eu ando percebendo nas minhas consultorias é algo que tem sido deixando totalmente de lado pelos profissionais Java. Sendo assim é altamente recomendado para aqueles interessados em deixarem de ser “crianças” para se tornarem verdadeiros “profissionais”. Eu costumo dizer nas minhas consultorias e palestras que é impossível uma pessoa ser um “Profissional Java” sem ter lido e assimilado estas diretrizes. Infelizmente não existem mais desculpas, uma vez que já temos livro até em português com preço bem acessível.

Ja faz algum tempo que eu venho resumindo e postando cada item do livro como material de estudo – material de referência e estudos.

“Pois todo o que pede, recebe; o que busca, encontra; e àquele que bate, a porta será aberta.” Lucas 11:10

Publicado em Java Effective

Concorrência – Item 66

autorama-5Sincronize o acesso a dados mutáveis compartilhados

Quando várias threads compartilharem dados mutáveis, é necessário que cada thread faça a operação de leitura e gravação aos dados de forma sincronizada. Caso contrário, não haverá garantias que as mudanças feitas de uma thread fiquem visíveis para outra, devido a uma possível otimização usada pelas JVM chamadas de “hoisting”.

As consequências são comportamentos não determinísticos, falhas de atividades e de segurança que são difíceis de depurar e podem ser intermitentes, dependendo de tempo e comportamento do programa que podem também variar radicalmente de uma JVM para outra. A melhor maneira de evitar essa situação ainda é escrever um programa que evite o compartilhamento de dados mutáveis entre threads concorrentes.

Para todas as informações, veja o post inicial.

“Exorta os velhos a que sejam temperantes, sérios, sóbrios, sãos na fé, no amor, e na constância” Tito 2:2

Publicado em Java Effective

Exceções – Item 65

dontignoremeNão ignore as exceções

Um bloco catch vazio invalida os fundamentos e a finalidade das exceções (checadas e não checadas) que é forçar a manipulação de condições excepcionais. Caso você tenha alguma situação no qual realmente não faça sentido fazer nenhuma implementação coerente em um tratamento de exceção, use uma das abordagens:

  • Comentário de código – nó mínimo escreva um comentário dentro do catch explicando o porquê foi apropriado não fazer nada com aquela condição de exceção.
  • Log – registre os ocorridos em um recurso de log apropriado.

Para todas as informações, veja o post inicial.

“Grande paz têm os que amam a tua lei; para eles não há tropeço. Salmos 119:165

Publicado em Java Effective

Exceções – Item 64

bombanuclear_hypesciencepontocomBusque atomicidade das falhas

Após um objeto lançar uma exceção, é desejável que ele continue em um estado bem definido e usável. Resumidamente, uma chamada de método incorreta deve deixar um objeto no estado que ele estava antes da chamada. Existem algumas abordagens para obter esse efeito:

  • Usar objetos imutáveis (Item 15) – se uma operação falhar, um novo objeto imutável não será criado e consequentemente não deixara o antigo em um estado inconsistente.
  • No uso de objetos mutáveis – verifique e valide todos os parâmetros antes de execução da operação (Item 38), fazendo a exceção ser lançada antes de qualquer alteração interna.
  • Código de recuperação – criar um código que armazene e reverta seu estado ao ponto anterior de inicio da operação.
  • Cópia temporária – criação de cópia temporária do objeto a ser processado e a substituição do conteúdo do objeto pela cópia, uma vez que a operação tiver sido concluída com sucesso.

A busca dessa atomicidade nem sempre é desejável, uma vez que para alcançar essa característica você pode aumentar significativamente o custo, complexidade de sua solução e até ocasionar perda de performance na solução.

Como regra sempre busque usar a atomicidade. Onde esse regra não for aplicável, a documentação da API (Item 44) deve indicar claramente em que estado o objeto poderá ser deixado.

Para todas as informações, veja o post inicial.

“Tornai-vos, pois, praticantes da palavra e não somente ouvintes, enganando-vos a vós mesmos.” Tiago 1:22

Publicado em Java Effective

Exceções – Item 63

os-pequenos-detalhes-sao-sempre-os-maisInclua informações de captura de falha em mensagens de detalhe

Quando um programa falha devida a uma exceção não checada, a JVM automaticamente exibe o rastreamento de pilha de execução com a descrição texto da determinada exceção. Estas costumam serem as únicas informações que os programadores ou o pessoal de serviço de campo têm quanto investigam uma falha no software. Portanto, é criticamente importante que o método toString() da exceção retorne o máximo possível de informações com relação a causa da falha.

Diante disso, é altamente recomendável que a mensagem de detalhe de uma exceção contenha os valores de todos os parâmetros e campos que contribuíram para gerar a falha do sistema. A abordagem que garante essa prática é assegurar que os construtores das determinadas exceções recebam como parâmetros os valores necessários para construir uma mensagem que ocasionaram a condição de exceção.

Para todas as informações, veja o post inicial.

“Ditoso o homem que se compadece e empresta; ele defenderá a sua causa em juízo.” Salmos 112:5