Thread Safe dan Non-Thread Safe Code, Apa Maksudnya?

Beberapa buku atau artikel yang pernah saya baca kadang menyebut-nyebut istilah thread safe. Konteksnya biasanya seperti ini “Kode program ini thread safe“, “Queue di Ruby sifatnya thread-safe“. Kebalikannya, ada juga yang menyematkan istilah non-thread safe di tulisannya.

Sebenarnya maksud dari thread safe dan non-thread safe itu apa?

Saatnya jujur, kita sebagai developer tidak jarang tidak paham dengan hal-hal yang sifatnya fundamental karena memang di kerjaan sudah dibantu dengan abstraksi. Thread contohnya, yakinkah kamu paham dengan apa yang dimaksud thread? Lalu apa itu multithreading? Dan bagaimana cara menulis kode program di bahasa yang biasa kita pakai supaya bisa multithreading?

Jujur-jujuran saja, saya termasuk programmer yang ignorant terhadap hal-hal dasar seperti ini. Satu pertanyaan, pernahkah kamu nulis kode program di production dengan menggunakan konsep multithreading? Kalau pakai Java berarti bikin kelas yang extend Thread atau implement Runnable, kalau di Ruby berarti pakai kelas Thread. Saya yakin ada tapi jarang. Urusan aplikasi web yang bisa menangani concurrent request sudah diurus oleh application server.

Baru-baru ini saja saya tiba-tiba pengen untuk belajar hal-hal yang fundamental seperti thread, terutama di Ruby.

Kembali ke pertanyaan awal, thread safe dan non-thread safe itu maksudnya apa?

Simak penjelasannya lewat tulisan ini. Penjelasan yang saya tulis ini adalah suatu penjelasan yang saya impi-impikan ada dari dulu dan saya baca supaya paham thread safe, non-thread safe di masa awal jadi programmer.

Multithread

Pembicaraan thread safe muncul ketika kita berbicara tentang kode program yang jalan secara concurrent karena sengaja kita buat seperti itu dengan multithread.

Secara sederhana thread safe code itu maksudnya kode yang kita tulis yang berjalan secara concurrent karena dibuat multithread bisa berjalan sebagai mana mestinya.

Non-thread safe tinggal kebalikannya. Berarti kodenya kalau dijalankan di multithread environment akan menghasilkan sesuatu yang berada di luar ekspektasi kita alias nge-bug.

Penjelasan seperti di atas saya rasa hanya sedikit membuka wawasan. Momen eureka-nya baru didapat kalau sudah lihat contoh kode program. Jadi mari saya tunjukkan.

Non-Thread Safe

PERHATIAN : Kode yang saya tulis di blogpost ini dijalankan dengan menggunakan JRuby, bukan Ruby biasa yang sebagaimana umumnya disebut Ruby.

Perhatikan kode di bawah ini.

Kode di atas membuat 10 buah thread dimana untuk masing-masing thread melakukan 1000x proses menambahkan string I’m engineer ke dalam array.

Di bagian akhir ditampilkan jumlah elemen yang dimiliki oleh array. Berapa seharusnya jumlahnya? Gampang : 10 * 10_00 = 10_000

Berikut hasil yang saya dapatkan

Wait, what?

Itu lah yang dinamakan non-thread safe. Ekspektasi kita adalah 10_000 tetapi kenyatannya hasilnya tidak selalu 10_000 dan ini berbahaya.

Kenapa bisa seperti itu? Karena proses memasukkan 10_000 string ke array berjalan secara concurrent maka ada kejadian dimana proses memasukan string I’m engineer terjadi secara bersamaan (istilah kerennya race condition) dan karena array di Ruby itu sendiri sifatnya non-thread safe.

Thread Safe

Kode di bawah ini adalah versi yang thread safe dari kode sebelumnya. Hanya mengganti dari array menjadi Queue. For your information, Queue merupakan satu-satunya struktur data di Ruby yang thread safe.

Dijalankan berkali-kali menggunakan JRuby hasilnya selalu 10_000.

Pertanyaan-Pertanyaan Lain

Cukup banyak pertanyaan yang bisa muncul dari tulisan ini. Kita sebut saja yang pertama, kenapa pakai JRuby dan bukan Ruby biasa? Lalu bagaimana kalau kita ingin tetap pakai array tapi tetap thread safe? Ada juga multithreading itu paralel atau concurrent? Dan nyambung ke apa bedanya paralel dengan concurrent?

Facebook Comments
 

Agung Setiawan

Agung Setiawan adalah software engineer di BukaLapak.com, penulis sekaligus pecinta sastra, dan pembaca buku

 
Halo, perkenalkan saya Agung Setiawan.
Seorang Software Engineer di BukaLapak, penulis buku, blogger, gunpla builder, tech educator.
Simak pemikiran saya soal dunia Software Engineering via Twitter di @agungsetiawanmu dan facebook
Mau belajar Vim bareng saya?
Belajar ngoding dari nol menggunakan PHP

One thought on “Thread Safe dan Non-Thread Safe Code, Apa Maksudnya?

Leave a Reply

Your email address will not be published. Required fields are marked *