Ada banyak jawaban untuk ini, tetapi bisa membingungkan. Saya suka berpikir seperti ini, dan mungkin itu membantu ?:
Pemrograman bersamaan adalah kode yang tidak peduli dengan urutan eksekusi. Java adalah bahasa yang buruk untuk pemrograman bersamaan, tetapi ada perpustakaan dan kerangka kerja untuk membantu. JavaScript adalah bahasa yang sangat baik untuk pemrograman bersamaan, dan seringkali sulit ketika Anda ingin menulis sesuatu yang tidak bersamaan (misalnya, jika Anda ingin memaksakan urutan eksekusi). Pemrograman bersamaan sangat bagus untuk pemrograman yang digerakkan oleh acara (di mana urutan eksekusi ditentukan oleh pendengar acara, seperti kode yang berjalan di browser Anda yang bekerja ketika Anda mengklik tombol atau mengetik ke dalam kotak).
Contohnya termasuk membuat seratus permintaan HTTP. Di NodeJS, solusi paling sederhana adalah membuka semua 100 permintaan sekaligus dengan metode panggilan balik, dan ketika respons kembali, metode dijalankan setiap kali. Itu pemrograman bersamaan. Di Ruby, solusi paling sederhana (paling umum) adalah membuka permintaan dan menangani respons, membuka permintaan berikutnya dan menangani respons, dll. Untuk banyak permintaan, NodeJS lebih mudah dilakukan secara tepat waktu, meskipun Anda harus hati-hati untuk menghindari memalu server atau memaksimalkan koneksi keluar Anda (mudah dilakukan karena kesalahan). Anda dapat menulis Ruby secara bersamaan, tetapi bukan bagaimana sebagian besar kode Ruby ditulis, dan sedikit menyakitkan untuk melakukannya.
Pemrograman paraleladalah kode yang dapat dijalankan secara bersamaan di banyak utas atau proses. Ini memungkinkan Anda untuk mengoptimalkan kinerja dengan menjalankan kode di beberapa CPU (seringkali termasuk beberapa mesin, seperti yang Anda lakukan dengan sesuatu seperti Akka). Karena NodeJS bukan multi-threaded dan tidak ada eksekusi paralel, Anda tidak perlu khawatir menulis kode threadsafe (dan sebagian besar kode JavaScript yang saya lihat bukan threadsafe). Di Jawa, meskipun bahasa tidak menjadikan pemrograman bersamaan sebagai pola normal, pemrograman paralel sangat terintegrasi, dan Anda sering harus khawatir tentang keamanan utas. Jika Anda menulis situs web di Java, biasanya ini akan dijalankan dalam wadah yang menjalankan setiap permintaan dalam utas terpisah di memori yang sama,
Beberapa hal di atas tergantung pada ruang lingkup dan batasan yang Anda bicarakan. Saya bekerja di Situs Web. Kebanyakan kode Java yang saya lihat bukan pemrograman bersamaan. Tentu, jika Anda memperkecil cukup, urutan yang diminta pelanggan tidak penting, tetapi jika Anda memperbesar lebih jauh dari itu, urutan hal-hal yang dieksekusi ditentukan oleh kode. Tetapi kode ini ditulis sehingga permintaan dapat dieksekusi secara paralel dengan banyak objek bersama yang harus diamankan.
Sementara itu, sebagian besar kode JavaScript yang saya lihat bersamaan: ditulis sedemikian rupa sehingga urutan pelaksanaannya tidak penting di banyak tingkatan. Tetapi tidak ditulis untuk mendukung eksekusi paralel dalam memori bersama. Tentu, Anda dapat menjalankan kode yang sama secara paralel di beberapa proses, tetapi objek tidak dibagi, jadi itu bukan pemrograman paralel dalam arti yang berarti.
Untuk bacaan tambahan, saya sangat suka ilustrasi di jawaban atas pertanyaan ini di sini: https://www.quora.com/What-are-the-differences-between-parallel-concurrent-and-asynchronous-programming