Apa itu Race Condition?
Race condition adalah situasi yang tidak diinginkan ketika sebuah perangkat atau sistem mencoba menjalankan dua atau lebih operasi secara bersamaan, padahal sebenarnya operasi tersebut harus dilakukan dalam urutan tertentu agar hasilnya benar.
Istilah race condition ini paling sering muncul di dunia ilmu komputer dan pemrograman. Race condition terjadi ketika dua proses program, atau thread, mencoba mengakses resource yang sama pada saat bersamaan dan menyebabkan masalah pada sistem.
Race condition merupakan isu umum yang sering ditemukan pada aplikasi yang menggunakan multithreading.
Contoh Race Condition
Contoh sederhana dari race condition adalah saklar lampu. Di beberapa rumah, satu lampu langit-langit bisa dihubungkan ke beberapa saklar. Pada sistem circuit seperti ini, posisi saklar menjadi tidak relevan. Jika lampu menyala, memindahkan salah satu saklar akan mematikan lampu, dan sebaliknya.
Bayangkan kalau dua orang mencoba menyalakan lampu dari dua saklar berbeda pada saat yang sama. Satu instruction mungkin membatalkan yang lain, atau bahkan bisa menyebabkan pemutus arus (circuit breaker) turun.
Dalam konteks memori atau penyimpanan komputer, race condition bisa terjadi ketika ada perintah untuk membaca dan menulis data dalam jumlah besar yang diterima hampir bersamaan. Mesin bisa saja menimpa (overwrite) sebagian data lama sementara data tersebut masih dibaca. Akibatnya bisa berupa:
- Komputer crash atau mendeteksi operasi ilegal dari program
- Error saat membaca data lama
- Error saat menulis data baru

Race condition juga bisa terjadi kalau instruksi dijalankan dalam urutan yang salah.
Misalnya dua proses harus melakukan bit flip di lokasi memori tertentu. Secara normal, operasi ini berjalan seperti yang ditunjukkan pada Gambar 1. Tapi kalau terjadi race condition, urutan operasinya bisa berubah seperti di Gambar 2.

Race condition kadang juga terjadi di logic gate saat ada konflik input. Karena output gate butuh waktu (walau sangat kecil) untuk berubah setelah input berubah, perangkat atau rangkaian yang sensitif bisa tertipu dan tidak berfungsi sebagaimana mestinya.
Jenis-jenis Race Condition
Ada beberapa jenis race condition. Secara umum, berdasarkan dampaknya terhadap sistem, race condition dibagi jadi dua:
- Critical race condition: menyebabkan perubahan pada state akhir perangkat, sistem, atau program. Contohnya, kalau dua saklar ditekan bersamaan dan menyebabkan korsleting, itu termasuk critical race condition. Di software, ini bisa menghasilkan bug dengan perilaku yang tak terprediksi.
- Noncritical race condition: tidak menyebabkan perubahan signifikan pada state akhir. Misalnya, menyalakan lampu dengan dua saklar sekaligus menghasilkan efek yang sama dengan satu saklar. Di software, ini tidak menyebabkan bug.
Jenis ini tidak hanya terbatas pada dunia elektronik atau programming. Race condition bisa muncul di berbagai sistem lainnya.
Dalam pemrograman, ada dua tipe race condition yang sering terjadi di critical section (bagian kode yang dieksekusi oleh beberapa thread):
- Read-modify-write. Race condition ini terjadi saat dua proses membaca satu nilai dan menulis kembali nilai baru. Kalau tidak berjalan sekuensial, akan terjadi bug. Misalnya, dalam sistem bank, dua cek diproses bersamaan dan sistem membaca saldo yang sama, padahal seharusnya diproses bergantian.
- Check-then-act. Terjadi saat dua proses mengecek nilai dan kemudian melakukan aksi berdasarkan hasil tersebut. Jika satu proses mengambil nilai duluan, proses lainnya membaca nilai sebagai null. Ini bisa menyebabkan program bertindak berdasarkan data yang salah atau tidak tersedia.
Vulnerabilities yang Disebabkan Race Condition
Program yang didesain untuk menjalankan operasi secara berurutan bisa rentan terhadap serangan jika ada race condition. Penyerang bisa memanfaatkan celah waktu antara inisiasi layanan dan aktivasi kontrol keamanan untuk menciptakan deadlock atau thread block.
Deadlock adalah bentuk parah dari denial-of-service, di mana beberapa thread saling menunggu untuk melepas atau mendapatkan lock dalam sebuah lingkaran, sehingga membuat sistem berhenti total.
Thread block juga bisa menurunkan performa aplikasi secara signifikan, terutama jika sebuah thread memegang lock saat menjalankan operasi yang lama dan memblokir thread lain.
Cara Mendeteksi Race Condition
Deteksi race condition itu susah karena ini masalah semantik dalam kode. Cara terbaik adalah mencegahnya dari awal dalam desain kode.
Programmer biasanya menggunakan alat analisis statis dan dinamis. Static testing menganalisis kode tanpa menjalankan program, tapi cenderung menghasilkan banyak false positive. Dynamic analysis lebih akurat, tapi bisa melewatkan race condition yang tidak langsung dieksekusi.
Race condition sering kali dihasilkan oleh data race — kondisi di mana dua thread mengakses lokasi memori yang sama, dan salah satunya menulis. Data race lebih mudah dideteksi, misalnya dengan Go Project’s Data Race Detector.
Bagaimana Cara Mencegah Race Condition?
Dua pendekatan umum untuk mencegah race condition dalam OS atau software adalah:
- Hindari shared states. Pastikan resource yang dipakai bersama dikunci atau dibuat immutable (tidak bisa diubah setelah dibuat).
- Gunakan sinkronisasi thread. Buat sistem supaya hanya satu thread yang bisa mengakses bagian program tertentu pada satu waktu.
Storage dan Memori
Serialisasi akses ke storage atau memori juga mencegah race condition. Artinya, perintah baca akan diselesaikan dulu sebelum perintah tulis dijalankan.
Jaringan
Dalam jaringan, race condition bisa terjadi kalau dua pengguna mencoba mengakses channel pada saat yang sama. Ini sering terjadi di jaringan dengan latensi tinggi, seperti yang pakai satellite geostationary.
Solusinya, perlu ada sistem prioritas, misalnya user dengan username alfabet lebih awal atau angka lebih kecil yang diberi hak akses lebih dulu.
Kesimpulan
Race condition bisa muncul dalam software, storage, memori, dan jaringan. Deteksi dini dan pencegahan race condition adalah bagian penting dari desain dan pengembangan teknologi.
Hal ini makin penting karena hacker bisa mengeksploitasi celah race condition untuk mendapatkan akses ilegal, seperti pada kasus Dirty Cow yang menyerang sistem Linux dengan memanfaatkan race condition di memory subsystem.