domingo, 5 de junho de 2005

Mutexes, barriers, semáforos, transações, latches, reentrant lock, recursive lock, monitors, spinloops, double check pattern, copy-on-write pattern, Fork/Join pattern, active objects, etc, ufa... devem fazer parte do léxico de qualquer programador. Apesar de utilizados esporadicamente, são ferramentas sempre presente para resolver problemas pontuais e bem definidos de desempenho global das aplicações.

A plataforma Java, sempre suportou programação concorrente, familiarmente associada ao conceito de Threads. Para isso disponibiliza as fundações básicas: a classe Thread, as primitivas syncronized e volatile, e os métodos wait, notify e notifyAll.

A programação concorrente é dos maiores desafios para um programador. Tanto pode resolver milagrosamente a performance de aplicações como pode ser fonte de inúmeros bugs exóticos, normalmente de demorada detecção e difícil resolução.

Por causa disto, ao longo destas últimas décadas (desde que apareceram as primeiras linguagens orientadas a objectos), foram surgindo formas estruturadas na abordagem a esta funcionalidade traduzidas em idiomas, padrões e frameworks. O objectivo é minimizar o risco para o programador na aplicação da “programação concorrente”. Basta a tarefa mais envolvente de perceber o objectivo em mãos, ter presente as suas limitações, estrutura-lo e finalmente escolher das ferramentas anteriores, a que melhor se aplica ao domínio do problema.

Este livro agrega as partes mais importantes desse conhecimento adquirido e aplica-o à linguagem Java. Para terem presente da importância e utilidade destas novas ferramentas, descritas no livro, desde que este foi originalmente editado, o autor -Doug Lea - teve a responsabilidade de aplicar a matéria dada, no desenvolvimento do novo pacote java.util.concurrent incluído na versão 1.5 da plataforma Java.

Recentemente, este tema, ganhou uma nova dimensão estratégica. Nestas últimas décadas, temos assistido ao desenvolvimento dos processadores, a um ritmo endiabrado, baseado em grande parte no aumento da sua velocidade de relógio, medido nos já familiares e "publicitáveis" Gigahertz. Isto tem como consequência directa no aparente aumento directo de desempenho na execução sequencial dos programas. O problema é que a tecnologia estagnou em 2005. A partir de agora os custos de fabrico e de operação, estarão a tornar-se desproporcionalmente elevados em relação ao aumento limitado da performace conseguida.

A nova orientação no desenvolvimento de processadores, passou dos Gigahertz, para número de Cores por processador. Cada “Core” é uma unidade de execução que na prática corresponde a existir múltiplos processadores no mesmo pacote.

Nestas últimas décadas temos estado a ser habituados a preferir esperar uns meses, para que uma aplicação pobre em desempenho, fique logo aceitável com a geração mais recente de processadores. O problema é que isso deixou de ser aplicável nas aplicações sequenciais tradicionais. Com a nova filosofia de múltiplos cores, só as aplicações desenvolvidas de raiz baseadas em threads, em que poderão tirar partido destas novas arquitecturas.

Este livro não é de fácil leitura. Obriga a estar bastante atento às frases. São feitas muitas vezes referencias a conceitos e termos que só estarão presentes em quem tiver já experiência de programação.

Só recomendo a quem estiver a realizar projectos que terão uma componente de concorrência sempre presente. Também será útil como livro de referência, para relembrar algum das funcionalidades apresentadas. Para quem só quiser uma introdução ao tema das threads, basta ler o excelente Tutorial do Java, sobre o assunto.