Ci sono molte risposte su questo, ma può essere fonte di confusione. Mi piace pensarlo in questo modo, e forse aiuta ?:
La programmazione concorrente è un codice a cui non interessa l'ordine di esecuzione. Java è un linguaggio scadente per la programmazione concorrente, ma ci sono librerie e framework per aiutare. JavaScript è un linguaggio eccellente per la programmazione concorrente ed è spesso difficile quando si desidera scrivere qualcosa che non è simultaneo (ad esempio, se si desidera forzare l'ordine di esecuzione). La programmazione concorrente è ottima per la programmazione basata su eventi (in cui l'ordine di esecuzione è determinato dai listener di eventi, come il codice in esecuzione nel browser che agisce quando si fa clic su un pulsante o si digita in una casella).
Un esempio potrebbe includere la creazione di un centinaio di richieste HTTP. In NodeJS, la soluzione più semplice è aprire tutte e 100 le richieste contemporaneamente con un metodo di callback e quando le risposte ritornano, ogni volta viene eseguito un metodo. Questa è una programmazione concorrente. In Ruby, la soluzione più semplice (più comune) è aprire una richiesta e gestire la risposta, aprire la richiesta successiva e gestire la risposta, ecc. Per molte richieste, NodeJS è più facile da eseguire in modo tempestivo, anche se devi essere facendo attenzione a non martellare il server o massimizzare le connessioni in uscita (facile da fare per errore). Puoi scrivere Ruby in modo simultaneo, ma non è come la maggior parte del codice Ruby è scritto, e fa un po 'male farlo.
Programmazione parallelaè un codice che può essere eseguito contemporaneamente in più thread o processi. Ciò consente di ottimizzare le prestazioni eseguendo il codice su più CPU (spesso includendo più macchine, come si potrebbe fare con qualcosa come Akka). Poiché NodeJS non è multi-thread e non c'è esecuzione parallela, non devi preoccuparti di scrivere codice thread-safe (e la maggior parte del codice JavaScript che ho visto non è thread-safe). In Java, anche se il linguaggio non rende la programmazione concorrente il modello normale, la programmazione parallela è molto integrata e spesso devi preoccuparti della sicurezza dei thread. Se stai scrivendo un sito Web in Java, in genere questo verrà eseguito in un contenitore che esegue ogni richiesta in un thread separato nella stessa memoria,
Alcuni dei precedenti dipendono dall'ambito e dai confini di cui stai parlando. Lavoro su siti Web. La maggior parte del codice Java che vedo non è una programmazione concorrente. Certo, se rimpicciolisci abbastanza, l'ordine in cui arrivano le richieste dei clienti non è importante, ma se ingrandisci ulteriormente, l'ordine in cui le cose vengono eseguite è dettato dal codice. Ma il codice è scritto in modo che le richieste possano essere eseguite in parallelo con molti oggetti condivisi che devono essere thread-safe.
Nel frattempo, la maggior parte del codice JavaScript che vedo è simultaneo: è scritto in modo che l'ordine di esecuzione non sia importante per molti livelli. Ma non è scritto per supportare l'esecuzione parallela nella memoria condivisa. Certo, puoi eseguire lo stesso codice in parallelo su più processi, ma gli oggetti non sono condivisi, quindi non è una programmazione parallela in alcun senso significativo.
Per ulteriori letture, mi piacciono molto le illustrazioni nella risposta in alto a questa domanda qui: https://www.quora.com/What-are-the-differences-b Between - parallel - concurrent - and - asynchronous-programming