Em seguida na simultaneidade

9

No ano passado, tenho trabalhado muito em concorrência em Java e construí e trabalhei em muitos pacotes simultâneos. Então, em termos de desenvolvimento no mundo concorrente, estou bastante confiante. Além disso, estou muito interessado em aprender e entender mais sobre programação simultânea.

Mas eu sou incapaz de me responder o que vem depois? Que extra devo aprender ou trabalhar para herdar mais habilidades relacionadas ao processamento multinúcleo. Se houver algum livro interessante (leia e apreciei 'simultaneidade na prática' e 'programação simultânea em java') ou recursos relacionados ao processamento multinúcleo para que eu possa passar para o próximo nível?

Jatin
fonte
Se você perdeu os fundamentos teóricos, aprenda-os agora: en.wikipedia.org/wiki/Pi-calculus
SK-logic

Respostas:

8

Isenção de responsabilidade - eu não sou especialista em concorrência, mas meu co-autor é: estou imitando ele :-)

Desde que você leu os livros de Doug Lea e Brian Goetz, você definitivamente cobriu o melhor material disponível até hoje.

Avançando, há os novos aprimoramentos de simultaneidade no Java 7. Mais notavelmente, a estrutura Fork / Join e as novas APIs NIO assíncronas.

O Java 8 apresentará outras melhorias de simultaneidade com coleções lambdas / paralelas.

Outra coisa a considerar seriamente é formas alternativas de lidar com a simultaneidade. Para ser franco, a abordagem de "bloquear objetos mutáveis" do Java sempre estará sujeita a erros, não importa o quanto as APIs sejam aprimoradas. Portanto, recomendo olhar o modelo de ator de Scala e o STM de Clojure como formas alternativas de lidar com problemas de concorrência, mantendo a interoperabilidade com Java.

[warning -> self Advertisement] Então, naturalmente, recomendo o nosso próximo livro, The Well-Grounded Java Developer , que cobre todas as coisas que mencionei acima: -). [/ warning]

Para que eu não esqueça, o Groovy também possui uma lib Gpars altamente recomendada, mas não a usei pessoalmente.

Martijn Verburg
fonte
Ha muito obrigado pelo livro :). Pode você também queira sugerir algum outro livro bom quanto o seu livro recomendado não está disponível aqui (edição local) em India.PS: Concurrency in Practice é uma jóia de um livro
Jatin
@Martijn, Neat! Estou curioso sobre Groovy e Scala há um tempo e queria brincar com ele para aprender mais. Seu livro é voltado para iniciantes nesses idiomas ou assume uma experiência anterior?
maple_shaft
@ Jatin Puri - Eu realmente não conheço outros títulos sobre 'concorrência na prática' e 'programação simultânea em java', existe o título O'Reilly de 'Java Threads' de Henry Wong, mas é isso.
Martijn Verburg
@maple_shift - Destina-se a iniciantes :-)
Martijn Verburg
2

A linguagem de programação D fornece dois paradigmas para a programação simultânea, os quais têm seus usos e são bastante interessantes.

std.concurrency fornece passagem de mensagem sem compartilhamento de memória padrão. Todas as variáveis globais e estáticas em D são thread-local por padrão e spawne sendnão permitem o envio de mensagens que contêm engano ponteiro mutável. O compartilhamento limitado pode ser obtido através da sharedpalavra - chave, o que implica uma verificação adicional pelo sistema de tipos. Fora do dialeto seguro do idioma, você pode forçar variáveis ​​globais / compartilhadas clássicas no estilo C / Java usando a __gsharedpalavra - chave, mas todas as apostas estão desativadas até a segurança da corrida. Este modelo é detalhado em um capítulo gratuito do livro de Andrei Alexandresu "The D Programming Language".

std.parallelism é menos seguro, mas de certa forma mais flexível que std.concurrency e é voltado especificamente para paralelismo de dados e tarefas multicore para aumentar a taxa de transferência de processamento de dados em vez da simultaneidade de casos gerais. Ele possui um loop foreach paralelo, chamadas de funções assíncronas, reduções paralelas, etc. Ele fornece mecanismos para facilitar a gravação de códigos seguros para corridas, mas isso ainda requer algum grau de disciplina.

Uma discussão mais aprofundada sobre os dois principais paradigmas de multithreading em D pode ser encontrada em meu recente artigo sobre o assunto.

dsimcha
fonte
2

Eu sugiro fortemente que você vá e dê uma olhada no Clojure

A abordagem da concorrência é muito nova e, a meu ver, um avanço significativo no que você vê em Java e na maioria das outras linguagens. Alguns pontos-chave:

  • Identidade e estado são separados - OOP cumpre a identidade do objeto com seu estado atual na forma de variáveis ​​de membro mutáveis. O Clojure separa estritamente a identidade (referências gerenciadas) e o estado (estruturas de dados imutáveis) de uma maneira que simplifica significativamente o desenvolvimento de programas simultâneos confiáveis.
  • Estruturas de dados imutáveis ​​persistentes - como tudo é imutável, você pode tirar um instantâneo dos dados / estado a qualquer momento e ter certeza de que eles não sofrerão mutações. Mas melhor que isso - são estruturas de dados persistentes que compartilham dados com versões anteriores. Como resultado, as operações estão muito mais próximas de O (1) do que do O (n) que você pagaria por uma estratégia de cópia na gravação para dados imutáveis.
  • Memória transacional do software - em vez de usar bloqueios, basta colocar o código em um bloco (dosync ...) e eles são executados automaticamente como uma transação. Sem risco de conflitos e sem necessidade de desenvolver estratégias complexas de bloqueio. Esta é uma vitória massiva, especialmente quando combinada com as estruturas de dados imutáveis ​​acima. Efetivamente, o Clojure implementa o controle de simultaneidade com várias versões em seu STM.
  • O paradigma de programação funcional é usado para facilitar a gravação de código simultâneo confiável. Basicamente, se você usar uma estrutura de dados imutável, execute-a através de uma função pura e produza uma estrutura de dados imutável diferente, seu código é garantido como seguro para simultaneidade.

Eu sugiro assistir a este vídeo como uma introdução

Mikera
fonte
1

Dê uma olhada na linguagem Scala, que estende Java e é executada na JVM. Ele empresta a noção de "atores" de Erlang e oferece boa capacidade para lidar com falhas de simultaneidade.

Matthew Flynn
fonte
1

Se você deseja elevar esse nível a um nível totalmente novo, convém analisar a programação com o CUDA .

Isso permite que você distribua seus algoritmos por centenas de núcleos de processamento em sua placa gráfica, em vez dos poucos núcleos principais da CPU. Existem até ligações de idiomas que aparentemente tornam relativamente fácil acelerar linguagens de alto nível como python usando técnicas de GPGPU .

Mark Booth
fonte
@Chiron - Para ser sincero, fiquei surpreso que ninguém mais tivesse mencionado isso.
Mark Booth