Pengenalan Threading dan Synchronization

Mahir Koding – Thread merupakan unit dasar dari penggunaan CPU. Ada beberapa sumber yang mengatakan, thread = proses. Berbicara tentang proses, kita tidak hanya sekedar membahas  suatu eksekusi source code, melainkan meliputi beberapa aktivitas yang bersangkutan seperti program counter dan stack. Sebuah proses juga melibatkan stack yang berisi data sementara (parameter fungsi/metode, return address, dan variabel lokal) dan data section yang menyimpan variabel-variabel global. Sebuah thread akan berbagi code section, data section dan resource sistem operasi dengan thread yang lain yang berjalan bersamaan.

Ada beberapa state yang terjadi dalam sebuah thread :

  • new : Thread baru saja dibuat.
  • running : Intruksi-intruksi dalam thread sedang dijalankan.
  • waiting : Thread menunggu untuk sebuah event terjadi.
  • ready : Thread sudah siap dijalankan dan menunggu untuk dieksekusi.
  • terminated : Thread telah selesai dijalankan.

Dalam penerapannya, thread akan terbagi menjadi 2 jenis dari sudut pandang eksekusinya :

  • Single-Thread = lightweight process (proses sederhana) yang hanya berjalan satu kali untuk menjalankan suatu tugas.
  • Multi-Thread = beberapa thread akan dijalankan bersama-sama dan mengerjakan lebih dari satu tugas dalam satu waktu.

Zaman sekarang, sistem operasi yang berjalan pada komputer modern sudah dirancang secara multithreading. Sebuah aplikasi biasanya diimplementasi sebagai proses yang terpisah dengan beberapa thread yang berfungsi sebagai pengendali. Contohnya sebuah web browser mempunyai thread untuk menampilkan gambar atau tulisan sedangkan thread yang lain berfungsi sebagai penerima data dari network.

Terkadang ada kasus dimana sebuah aplikasi perlu menjalankan beberapa tugas yang sama. Misalnya, web server dapat mempunyai ratusan klien yang mengaksesnya secara bersamaan/concurrent. Jika kita hanya web server tersebut tidak mendukung multi-thread, berarti hanya ada satu client yang dapat mengakses resource secara bersamaan. Akhirnya, ratusan client lainnya harus menunggu client tersebut telah selesai mengakses web. Solusinya adalah dengan membuat web server menjadi multi-threading. Dengan ini maka sebuah web server akan membuat thread untuk meresponse request dari client, ketika request lain diterima maka web server akan membuat thread baru untuk meresponse request tersebut.

Next, synchronization.

Pada suatu sistem multithreading, sinkronisasi adalah suatu proses pengendalian akses dari sumber daya terbagi pakai (shared resource) oleh banyak thread sedemikian sehingga hanya satu thread yang dapat mengakses sumber daya tertentu pada satu waktu.

Dalam aplikasi multithreaded yang tidak tersinkronisasi, sangat mungkin terjadi adanya satu thread memodifikasi suatu obyek yang dipakai bersama pada saat thread lain sedangkan dalam proses menggunakan atau mengupdate nilai obyek tersebut. Sebagai contoh, perhatikan gambar di bawah ini :

Thread pada gambar diatas akan mengakses ataupun menggunakan resource account dan amount yang sama. Jika thread yang pertama sedang menjalankan tugas “pengurangan saldo”, dan thread kedua melakukan hal yang sama. Maka tidak bisa kita pungkiri, akan ada saatnya balance account tersebut mengalami kesalahan data. Misalnya, saldo saat ini adalah 100.000 rupiah, ketika thread A mengambil uang 10.000 dan thread B mengambil uang 20.000 maka seharusnya saldo saat ini sisa 70.000. Namun, ketika thread A dan B dijalankan bersamaan secara linear, bisa saja saldo yang terpotong hanya salah satunya akibat method get_balance(account) tidak mengambil saldo yang telah terpotong oleh thread lain (keterlambatan proses dipengaruhi oleh memory dan processor).

Sinkronisasi mencegah jenis kerusakan data demikian, jika tidak disinkronkan maka dapat mengakibatkan pembacaan yang buruk dan error yang signifikan.

Untuk mengamankan hal ini agar tidak terjadi, maka ada yang namanya mekanisme lock object pada shared resource. Mekanisme object lock (penguncian obyek) menjalankan aturan-aturan sinkronisasi berikut:

  • Suatu thread harus memperoleh object lock yang diasosiasikan dengan suatu sumber daya terbagi-pakai, sebelum ia dapat memasuki sumber daya terbagi-pakai tersebut. Sistem runtime memastikan bahwa tidak ada thread lain yang dapat memasuki sumber daya terbagi-pakai jika suatu thread sudah memegang (hold) object lock yang diaosiasikan dengan sumber daya terbagi-pakai tersebut. Jika suatu thread tidak dapat dengan segera mendapatkan object lock,maka ia harus menunggu sampai lock tersedia.
  • Pada saat suatu thread berada di dalam suatu sumber daya berbagi-pakai, sistem runtime memastikan bahwa object lock juga dilepaskan. Jika suatu thread lain sedang menunggu object lock ini, ia dapat diproses untuk mendapatkan lock agar memperoleh akses ke sumber daya terbagi-pakai tersebut.

Demikianlah artikel untuk “Pengenalan Thread dan Synchronization”. Berikutnya, kami akan mencoba membahas bagaimana cara mengimplementasikan thread ini dalam bahasa Java. Silahkan komentar pada kolom di bawah jika ada hal yang kurang jelas. Thankyou!