Olá colegas!
O artigo, cuja tradução oferecemos hoje, lembra mais uma vez a importância do livro eterno "
Java Concurrency in practice ", de Brian Goetz.
As datas dos comentários deste artigo no original sugerem que o autor não está atualizando e republicando pela primeira vez. Portanto, também nos permitimos atualizar o link para o livro mencionado no artigo de Raul-Gabriel Urm, Mario Fusco e Alan Mycroft, publicado por Manning sob o título Java 8 in Action. Estamos preparando uma tradução de uma nova edição chamada Modern Java. Mas, por enquanto, vamos falar sobre os clássicos. Você está convidado para o gato.
Um leitor com o apelido Shobhit me fez essa pergunta nos comentários de um artigo sobre
12 livros Java avançados para programadores de nível médio - parte 1 . A pergunta é realmente boa, e acho que muitos programadores de Java tiveram dúvidas semelhantes quando, em nosso tempo, alguém recomendou que lesse
Java Concurrency in Practice . Quando este livro foi publicado pela primeira vez, em 2006, todo o mundo Java ainda não conseguia descobrir as inovações no campo da competição feitas no Java 1.5. Acho que foi feita a primeira tentativa séria de melhorar o suporte interno do Java para multithreading e competitividade. Muitos programadores nem suspeitaram das novas ferramentas que apareceram na API, por exemplo, sobre
CountDownLatch ,
CyclicBarrier ,
ConcurrentHashMap
e muitas outras. O livro serviu como uma introdução depurada para trabalhar com essas ferramentas e contou como usá-las para escrever aplicativos Java competitivos de alto desempenho.
Essa é exatamente a idéia geral deste livro e, nesse sentido, muitos desenvolvedores descreverão para você se você perguntar "Como você gosta de" Simultaneidade na prática em Java ""? No entanto, considero este livro um pouco diferente, e é por isso que
ainda o recomendo a todos os novatos que estão familiarizados com Java ou desenvolvedores de nível intermediário que desejam aprender conceitos relacionados à concorrência.
O material mais importante que este livro apresentará é conceitos e fundamentos claros da programação competitiva, em particular visibilidade, pedidos,
segurança de threads ,
imutabilidade , simultaneidade, etc.
Ela também explica por que, na maioria dos casos, os aplicativos Java competitivos são digitados incorretamente, por que os programadores Java cometem erros comuns que levam a problemas de multithreading, incluindo condições de corrida, deadlock, bloqueio ativo, interferência de memória e cálculos simplesmente incorretos.
O livro usa emoticons que acompanham a descrição de "como fazer errado", antes de apresentar ao leitor a solução correta e de alta qualidade para o problema. Portanto, o livro não apenas ajuda a lidar com os conceitos errôneos que muitos desenvolvedores de Java têm, mas também a instilar na comunidade Java as informações corretas sobre como trabalhar com multithreading e concorrência.
Não há dúvida de que o multithreading e a concorrência são complexos. Eles não são fáceis de implementar corretamente no código; é igualmente difícil de entender e explicar. Conheço muitos programadores que simplesmente não conseguem descrever visualmente como diferentes threads interagem com o mesmo elemento de código, operando com dados diferentes.
Como no exemplo clássico de recursão, a multithreading é muito fácil para alguns programadores praticarem, enquanto para outros é difícil compreender e aplicar a multithreading em um cenário de aplicativo.
A maior contribuição do livro Java Concurrency in Practice para o desenvolvimento do mundo Java não é simplificar a concorrência, mas fornecer informações verdadeiras e precisas sobre o que estava faltando. Desde então, conduzi muitas entrevistas e sei que os programadores nem sempre imaginam com precisão o dispositivo de fluxo e como eles funcionam.
Muitos programadores que conseguiram trabalhar com Java por 4-5 anos não entendem
como as variáveis voláteis são organizadas ; tudo o que eles sabem é que, ao trabalhar com uma variável mutável, você precisa verificar a cada comparação qual valor está na memória principal. Isso é verdade, mas apenas parte da verdade.
Eles não foram informados sobre o modelo de memória Java, sobre como uma variável variável pode afetar a ordem do código e a execução das instruções computacionais em seu núcleo. Trata-se de usar a compilação dinâmica (
JIT ) e a Java Virtual Machine (
JVM ) para otimização; essa otimização pode levar a erros lógicos sutis.
As pessoas não são informadas sobre como variáveis mutáveis permitem que você veja o que foi feito em um thread antes de acessar uma variável de outro thread, etc. Nem todo mundo sabe o que é uma barreira de memória e como ela afeta a visibilidade.
É do livro Java Concurrency in Practice que muitos programadores de Java estudaram todos esses conceitos. Devo admitir que eu mesmo, até lê-lo, estava de muitas maneiras enganado sobre muitos assuntos significativos de multithreading e competição, em particular a sequência, visibilidade e efeitos implícitos das variáveis finais e publicação segura. O livro me ajudou a descobrir isso.
A propósito, se algumas seções do livro parecerem um pouco incompreensíveis para você - acredite em mim, não apenas para você. Aqui, agradecemos ao Dr. Heinz Kabutz, que descreveu o material do livro de forma simplificada em seu curso
Java Concurrency in Practice Bundle .

Mesmo que esse material pareça muito complicado para você, a Heinz tem outro curso,
Mastering Threads , que ajuda a entender multithreading para qualquer programador Java comum.
Agora, vamos falar sobre o Java 8, ou seja, o que mudou do Java 1.5 para o Java 8. Muitas ferramentas novas apareceram no JDK para introduzir competitividade e projetar aplicativos Java mais competitivos. O conjunto de
junções de garfo apareceu no JDK 7
e no
CompleteableFutures
no Java 8. É muito mais importante que, começando no Java 8, um novo estilo de programação mais funcional, fornecido com
expressões lambda , seja corrigido.
Também temos fluxos e fluxos paralelos, permitindo que os desenvolvedores tirem vantagem da competitividade sem programá-la. Toda a idéia de levar a implementação da concorrência dos desenvolvedores de aplicativos e delegá-la aos desenvolvedores da API simplifica levemente a situação da concorrência em Java e reduz os riscos de sua implementação.
Isso também significa que em Java você pode executar operações em massa em vários threads usando apenas alguns métodos, sem escrever uma única linha de código relacionada aos threads, à palavra-chave sincronizada ou aos métodos de espera e notificação.
Sem dúvida, qualquer desenvolvedor Java precisa aprender essas novas ferramentas para acompanhar o desenvolvimento da tecnologia - o que, é claro, ajudará um livro como o
Modern Java In Action . Ele não apenas apresentará todas as inovações da linguagem Java, mas também ajudará você a aprender como usá-las nas tarefas diárias, entender a motivação dessas inovações e obter uma idéia geral da linguagem Java moderna.

Embora o livro Java Concurrency in Practice em sua forma atual não abranja todos esses conceitos e ferramentas importantes, ele continua sendo inestimável para explorar os principais recursos da linguagem Java relacionados a
threads ,
concorrência e
multithreading .
O livro de Götz ainda é uma leitura obrigatória para qualquer desenvolvedor Java que queira aprender e dominar multithreading e competitividade - os maiores pontos fortes de Java no desenvolvimento de aplicativos.
Com base no exposto, eu, como muitos desenvolvedores de Java do mundo, gostaria de ver a edição atualizada do Java Concurrency in Practice, que consideraria as ferramentas e metodologias que apareceram no Java 6, 7, 8, 9, 10 e talvez até no Java 11. Afinal, versões atualizadas dos
padrões de design Effective Java e
Head First apareceram , cobrindo o Java 8 e demonstrando quão mais fácil é implementar vários padrões usando os novos recursos do Java 8.