270 likes | 406 Views
Novas facilidades de concorrência com o Java7. Luiz Arnaldo de Gusmão Bastos lucabastos@gmail.com. 1945 John Neumann e outros Primeiro modelo de computador. 1960 Sistemas operacionais “time sharing”. Início da década de 80 IBM PC. Situação atual. Evolução dos microprocessadores.
E N D
Novas facilidades de concorrência com o Java7 Luiz Arnaldo de Gusmão Bastos lucabastos@gmail.com
1945 John Neumann e outros Primeiro modelo de computador
1960 Sistemas operacionais “time sharing”
Início da década de 80 IBM PC
Lei de Amdahl (1967) S = tempo gasto no processamento seqüencial n = número de processadores
Exemplo da lei de Amdahl S = 60%
Lei de Amdahl modificada S = tempo gasto no processamento seqüencial n = número de processadores H(n) = overhead devido a adicão de threads (sincronização, atividades entre as threads, etc.)
Lei de Gustafson s = tempo gasto no processamento seqüencial N = número de processadores s = 60%
Resumo até agora Ganho depende da relação entre o processamento seqüencial e o processamento concorrente do sistema
Pergunta que nos interessa: A plataforma Java permite aproveitar de forma correta e eficiente o novo hardware multiprocessado?
Resposta • O Java já é uma das melhores plataformas para aplicações concorrentes. • Mas o uso correto e eficiente do novo hardware multiprocessado ainda ficará por conta da habilidade do programador.
Java é uma ótima plataforma mas ainda enfrenta algumas lendas urbanas Pergunta: new Object() é mais lento do que malloc?
Resposta: Não O Garbage collector do Java é tão ou mais eficiente do que fazer gerenciamento direto da memória com malloc/free do C/C++
Outra crendice A performance sempre piora muito com o uso de synchronized, volatile ou Locks Totalmente errado. Não deixem de usar os recursos do Java apenas por ouvir falar.
Resumindo • Java não é tão bom quanto o Erlang para aplicações concorrentes mas é muito bom e melhor do que a maioria das plataformas. • Desenvolver aplicações concorrentes é difícil e apesar do Java facilitar muitas coisas, não perdoa programação ruim.
Candidatas a novidades no modo de tratar concorrência no Java 7 • Framework Fork/Join • TransferQueue • ParallelArray
Onde obter as candidatas • Por enquando se chama jsr166y e pode ser obtida em: • http://gee.cs.oswego.edu/dl/jsr166/dist/
Framework Fork/Join Result solve(Problem problema) { if (problem é pequeno) resolve diretamente else { divide o problema em partes independentes fork novas subtarefas para resolver cada parte join todas as subtarefas compõe os resultados a partir dos subresultados } }
TransferQueue • Interface que extende BlockingQueuee é usada quando o produtor precisa esperar que os consumidores estejam prontos para receber os elementos. • A classe que implementa esta interface é LinkedTransferQueue que é uma TransferQueue ilimitada baseada em nós linkados
ParallelArray • Como o nome diz, é um array que suporta operações paralelas • Fornece operações do tipo: apply, map, reduce, select, transform, etc. • Encapsula um ForkJoinExecutor e um array de modo a permitir as operações paralelas.
Exemplo de ParallelArray import static Ops.*;class StudentStatistics { ParallelArray<Student> students = ... // ... public double getMaxSeniorGpa() { return students.withFilter(isSenior).withMapping(gpaField).max(); } // helpers: static final class IsSenior implements Predicate<Student> { public boolean evaluate(Student s) { return s.credits > 90; } } static final IsSenior isSenior = new IsSenior(); static final class GpaField implements MappertoDouble<Student> { public double map(Student s) { return s.gpa; } } static final GpaField gpaField = new GpaField(); }
O que pensa o mentor das novidades • O prof. Doug Lea não espera uma adoção em massa das novas facilidades. • Poucas aplicações precisarão do seu uso. • Mas os que realmente precisarem terão nas mãos mais opções
Lembrete • O mundo é concorrente • As coisas no mundo não compartilham dados • As coisas se comunicam por mensagens • As coisas, às vezes, falham
Dúvidas? lucabastos@gmail.com