Data Race


Data Race pada Pemrograman Komputer

Written by Achmad Rizal Muttaqin on Wednesday January 18, 2017
- Comments
Achmad Rizal Muttaqin

Para pembaca yang budiman, kali ini saya akan share sedikit informasi mengenai istilah Data Race pada pemrograman komputer. Data race merupakan suatu bug pada program komputer yang dapat terjadi jika kondisi-kondisi berikut tercapai

  1. Dua atau lebih thread dalam suatu proses mencoba untuk mengakses suatu memori pada lokasi tertentu dalam waktu yang bersamaan
  2. Minimal satu thread melakukan operasi write (menyimpan ke dalam memori)
  3. Thread yang ada tidak menggunakan lock atau metode sinkronisasi tertentu untuk mengontrol akses thread ke memory

Berikut adalah contoh kode program dalam bahasa pemrograman Java yang akan mengakibatkan terjadinya data race


// Kode Program
// Bahasa Pemrograman Java
public class Example extends Thread {
  private static int cnt = 0;
  public void run() {
    int y = cnt;
    cnt = y + 1;
  }// Main
  public static void main(String args[]) {
    Thread t1 = new Example();
    Thread t2 = new Example();
    t1.start();
    t2.start();
  }
}

Program 1

Pada contoh kode Program 1, dapat dilihat bahwa kode program akan menjalankan 2 thread. Masing-masing thread akan melakukan operasi increment pada satu variabel global yaitu cnt yang memiliki nilai awal 0. Ketika kode program dijalankan, maka thread yang ada juga akan segera berjalan secara bersamaan. Ketika satu thread sedang mengakses variabel cnt dan melakukan operasi increment, maka thread yang lain akan mendapatkan nilai yang tidak pasti dari variabel cnt karena sedang diakses dan dimodifikasi nilainya secara bersamaan oleh thread yang berbeda. Pada bahasa pemrograman Java, hal ini dapat diatasi dengan menggunakan metode Synchronization yaitu dengan membuat satu object lock yang harus dikunci agar dapat melakukan suatu fungsi tertentu. Berikut contoh dari kode program 1 yang dimodifikasi untuk menggunakan Synchronization.


// Kode Program
// Bahasa Pemrograman Java
public class Example extends Thread {
  private static int cnt = 0;
  static Object lock = new Object();
  public void run() {
    synchronized (lock) {
      int y = cnt;
      cnt = y + 1;
    }
  }// Main
  public static void main(String args[]) {
    Thread t1 = new Example();
    Thread t2 = new Example();
    t1.start();
    t2.start();
  }
}

Program 2

Pada contoh kode program 2, untuk setiap thread yang akan melakukan operasi increment terhadap variabel cnt, harus mengunci variabel lock terlebih dahulu, sehingga saat satu thread sedang melakukan operasi increment, maka thread yang lain harus menunggu untuk melakukan operasi increment terhadap variabel cnt dikarenakan variabel lock sedang dikunci oleh thread tersebut. Semoga bermanfaat

https://www.cs.umd.edu/class/fall2005/cmsc433/lectures/threadsPart2.pdf
comments powered by Disqus

— Copyright © 2017 PT. Comestoarra Bentarra Noesantarra —