quarta-feira, 6 de março de 2013

Cuidados em relação ao uso de Threads


Estive dando uma boa estudada em threads e registrei algumas observações que acho útil deixar aqui no blog, pode ser de interesse para quem também esteja estudando o tópico.

Tenho dito que usar threads é imperativo no Android, quem já tomou um "ANR" ou mais recentemente, "NetworkOnMainThreadException", sabe do que estou falando.
Já postei também sobre os diversos benefícios advindos do uso de threads em aplicativos Android.

Mas, tem o outro lado da questão: os riscos no uso de threads.
Primeiro temos os riscos de segurança, relacionados com o uso compartilhado de dados, principalmente dados mutáveis, e seu gerenciamento, podemos resumir esses problemas como "acesso em momento indevido", seja por acesso a um objeto em fase de construção, ou no meio de uma atualização, ou atomicidade, ou problemas de visibilidade.
Por visibilidade entendam: uma thread pode não "ver" as últimas alterações que outra thread tenha feito num determinado dado.
Depois temos os problemas relacionados com ativação de threads, seja travamento por deadlock, ou threads que não conseguem avançar por falta de recursos.
E, por fim, temos os problemas de performance, afinal, ter uma outra thread tem um custo, que não está relacionado com processamento produtivo e sim em gerenciar as diversas threads.

Usar threads com eficiência significa tentar usar o máximo de processamento paralelo e o mínimo de processamento sequencial. Identificar quando o processamento deve ser sequencial, é responsabilidade do programador, então, o DVM (Dalvik Virtual Machine) espera (e todos os seus usuários, sem contar o seu chefe e outros interessados...) que você tenha informado corretamente esses pontos de sincronismo.
Isso, sincronização, deve ser feito para garantir consistência sequencial.
Você precisa ter ciência de que o compilador, o Dalvik, o Sistema Operacional e o processador todos estão fazendo malabarismos com o seu código para obter o máximo de performance possível.
Então saiba usar nos lugares certos as palavras chaves synchronized, volatile, lock, unlock, wait, notify, etc, senão o seu programa vai fazer coisas difíceis de imaginar, imagine como conseguir corrigir!

Bons códigos!

quinta-feira, 21 de fevereiro de 2013

Dica: Projeto Euler


Existe um site chamado ProjectEuler.net, que contém uma série de problemas de matemática para serem resolvidos através da elaboração de algorítmos e implementados em alguma linguagem de programação.
Como cada problema pode ser solucionado de diversas formas, existe uma regra geral para validar uma solução: o programa deve encontrar a resposta em menos de um minuto.
Então, cada problema é um desafio para a sua criatividade.
É uma excelente ferramenta para quem está aprendendo programação, ou, para quem está aprendendo uma nova linguagem, e também, para quem quer resolver problemas não relacionados com o dia-a-dia de seu trabalho.
Outra coisa interessante é que ao resolver o problema, você tem acesso ao forum do problema onde pode acompanhar as discussões sobre as dificuldades do problema e, principalmente, as diversas soluções apresentadas na sua linguagem e em outras.

Estou aproveitando para resolver os problemas usando os recursos da linguagem Java. Para solucionar os problemas estou usando uma estratégia de "reinventar a roda", ou seja, sempre que possível procuro desenvolver uma rotina própria ao invés de usar um recurso pré-existente.
Por exemplo, em problemas envolvendo grandes números (com centenas de dígitos) não faço uso do BigDecimal, ou BigInteger.
É uma forma de conhecer e programar rotinas com outra visão.

Outra regra muito importante é: Não publicar a solução dos problemas.
Afinal, o que importa é cada um descobrir a sua solução!

Bons códigos!

sábado, 9 de fevereiro de 2013

Releituras


Aproveitando o início do ano, fiz um ciclo de revisão de conhecimentos.
Reli os livros abaixo.

  1. Java concorrente na prática - Brian Goetz

  2. Google Android para Tablets - Ricardo Lecheta

O livro seguinte eu estou lendo um ou outro tópico por semana.

  3. Effective Java - Joshua Bloch

Essa revisão foi muito proveitosa, usei para me aprofundar em alguns tópicos que tinha deixado para depois ou não tinha entendido completamente.

O foco neste semestre é ficar atualizado com os estudos do Android até o Jelly Bean.