Thread, Concurrency, dan Parallelism: Apa Bedanya?
Proses vs Thread
Sebelum bicara soal thread, mari samakan dulu istilah dasar:
- Process (proses): sebuah program yang sedang berjalan, punya memori sendiri yang terisolasi dari proses lain. Ketika Anda membuka Chrome dan VS Code, itu dua proses terpisah.
- Thread: unit eksekusi terkecil di dalam sebuah proses. Satu proses bisa punya banyak thread yang berjalan bersamaan, dan semua thread di proses yang sama berbagi memori yang sama.
Analogi sederhana: proses adalah sebuah pabrik, thread adalah pekerja-pekerja di dalamnya. Semua pekerja di pabrik yang sama bisa mengakses gudang bahan baku yang sama (memori bersama)—tapi pabrik lain (proses lain) punya gudangnya sendiri yang terpisah.
Concurrency vs Parallelism: Sering Dianggap Sama, Padahal Beda
Ini salah satu kebingungan paling umum di kalangan junior developer.
Concurrency adalah tentang mengelola banyak tugas sekaligus—tapi belum tentu benar-benar dikerjakan di saat yang sama persis. Bayangkan satu koki yang menangani tiga pesanan sekaligus: dia mengaduk sup sebentar, beralih memotong sayur, kembali lagi mengaduk sup, lalu memeriksa oven—satu koki, tapi pekerjaannya "diselang-seling" dengan cerdas.
Parallelism adalah benar-benar mengerjakan banyak tugas di saat yang bersamaan secara fisik—butuh lebih dari satu "pekerja" (CPU core) yang benar-benar aktif di waktu yang sama. Tiga koki berbeda, masing-masing menangani satu pesanan, di waktu yang benar-benar sama.
Concurrency (1 CPU core):
Core 1: [Tugas A][Tugas B][Tugas A][Tugas C][Tugas B]...
Parallelism (3 CPU core):
Core 1: [Tugas A][Tugas A][Tugas A]...
Core 2: [Tugas B][Tugas B][Tugas B]...
Core 3: [Tugas C][Tugas C][Tugas C]...
Bisa saja concurrent tanpa parallel (satu core menyelang-nyelingkan banyak tugas), tapi tidak mungkin parallel tanpa concurrent (kalau ada banyak core aktif mengerjakan tugas berbeda, itu otomatis juga bentuk concurrency).
Kalau JavaScript Single-Threaded, Kenapa Bisa Handle Banyak Hal Sekaligus?
JavaScript (baik di browser maupun Node.js) berjalan di satu thread utama saja untuk mengeksekusi kode Anda. Tapi ini tidak berarti JavaScript tidak bisa menangani banyak operasi "sekaligus"—triknya ada di Event Loop dan fakta bahwa operasi I/O (network request, baca file, query database) sebenarnya ditangani oleh sistem operasi atau thread pool di belakang layar (bukan oleh thread JavaScript itu sendiri), lalu hasilnya dikembalikan ke thread utama saat sudah siap.
Ini kenapa topik asynchronous programming sangat berkaitan dengan topik ini: asynchronous adalah strategi untuk tetap responsif meski cuma punya satu thread, bukan benar-benar menjalankan banyak hal secara paralel.
Race Condition: Masalah Klasik di Dunia Multi-Thread
Ketika beberapa thread mengakses dan mengubah data yang sama secara bersamaan tanpa koordinasi, hasilnya bisa tidak terduga. Ini disebut race condition.
Contoh klasik: dua thread sama-sama membaca nilai counter = 5, lalu masing-masing menambah 1 dan menyimpan hasilnya. Kalau tidak dikoordinasikan, hasil akhirnya mungkin 6 (padahal seharusnya 7, karena kedua thread membaca nilai lama yang sama sebelum salah satu sempat memperbarui).
Thread A: baca counter (5)
Thread B: baca counter (5) <- Sama-sama baca nilai LAMA
Thread A: counter = 5 + 1 = 6, simpan
Thread B: counter = 5 + 1 = 6, simpan <- Harusnya 7, tapi jadi 6!
Solusinya di bahasa multi-threaded biasanya memakai lock/mutex (mekanisme "kunci" yang memastikan hanya satu thread yang boleh mengubah data di satu waktu). JavaScript yang single-threaded untuk eksekusi kode "biasa" secara alami terhindar dari race condition semacam ini—tapi tetap bisa punya race condition versinya sendiri di level asynchronous (misalnya dua request API yang saling menimpa hasil satu sama lain kalau tidak ditangani hati-hati).
Kesimpulan
Thread adalah unit eksekusi di dalam sebuah proses; concurrency adalah soal mengelola banyak tugas (belum tentu bersamaan secara fisik), sementara parallelism adalah benar-benar mengerjakannya di saat yang sama menggunakan banyak core. JavaScript cuma punya satu thread utama, tapi tetap responsif berkat event loop dan asynchronous I/O—bukan karena benar-benar paralel. Memahami perbedaan ini jadi fondasi penting sebelum melangkah ke topik yang lebih lanjut seperti Web Workers, worker threads di Node.js, atau bahasa yang benar-benar multi-threaded seperti Go dan Java.
Artikel Terkait
Diskusi Pembaca (0)
Belum ada komentar. Jadilah yang pertama berdiskusi!
