Curioso, mas existem ainda um monte de razões para Java não ser sequer cogitado no lugar de C:
-Consumo de memória, para dispositivos compactos utilizar Java pode ser um desastre, já que a JVM consome uma enormidade de recursos e a KVM é quase uma ordem de magnitude mais lenta que a HotSpot.
-Múltiplas aplicações, se você precisa rodar multas aplicações simultâneamente, Java é sua útlima escolha, image implementar em Java os Widgets do Dashboard do mac? Imagive você ter umas 10 JVM rodando simultâneamente, cada uma chupando 10M de ram. Quando o programa equivalente em C consome uma pequena fração disso.
-Integração com SO ou necessidade de executar operações de baixo nível como geração dinâmica de código. Para isso é dificil imaginar como Java poderia ser útil, por sinal.
Quanto a programação concorrente, Java usa o mesmo modelo que c, apenas ter uma biblioteca um pouco mais requintada. Todas construções e facilidades existem para C/C++. Outra coisa, Java ainda é uma piada ainda quando o assunto é programação concorrente por uma enorme série de motivos:
-Quanto maior o número de cores e memória RAM, maior o tempo desperdiçado com GC. Dado que não existe nenhuma JVM com suporte a GC realmente concorrente - O Metronome não entra nessa categoria pois ele é para sistemas realtime, então possui outros tradeoffs. Experimente rodar java com 16 cores e 32Gb de ram, vai ver que quase 40% do tempo vai ser torrado pelo GC.
-Java não possui nenhum recurso para criar aplicações no estilo Fork/Join tão facilmente quanto com OpenMp ou as extensões paralelas do fortran. Com Lisp é trivial escrever uma implementação de for/all e map/reduce usando múltiplas threads, com Java isso consome algumas centenas de linhas de código e fica com uma enorme cara de bacalhau.
-Thread local storage no Java é sofrivelmente lenta, além de ser um vespeiro para memory leakage. Compare com C, onde o custo de acessar uma variavel threadlocal é quase a mesmo que uma variavel volatile. Em Java com ThreadLocal você precisa passar por um HashTable primeiro.
-Se você quiser usar coisas como SIMD ou CUDA com Java, aquele abraço, vai precisar de C.
No geral, programação paralela é algo extremamente dificil, eu já apanhei muito de programas que supostamente eram simples e os bugs levavam semanas para serem descobertos em produção.
Não acho que o modelo do Java ou do C seja útil para consumo em massa, pois a grande maioria dos programadores, nossos code monkeys, não vão conseguir produzir nada funcional apenas esmurrando o teclado, como fazem no dia a dia.
Java e C são linguagens com utilidades distintas e já fazem alguns anos que performance deixou de ser motivo para qualquer argumento.