Belajar Golang #29 : Memahami Penggunaan Mutex

Tutorial Golang ke – 29 membahas cara menggunakan mutex (Mutual exclusion) di Golang. Namun sebelum belajar mutex saya sarankan untuk membaca postingan artikel sebelumnya mengenai channel dan goroutine.

Ketika kita menggunakan Goroutine baik menggunakan channel maupun tidak akan berjalan sangat cepat. Bayangkan ketika kita mempunyai 2 buah goroutine yang jalan dimana goroutine tersebut mengakses satu fungsi data(Race condition).

Analogi nya seperti ini, ada 2 orang yag ingin makan di warung dengan lauk ayam. Kebetulan di warung tersebut hanya tersedia satu ayam saja. Maka hanya orang yang datang duluan yang beruntung makan dengan lauk ayam.

Apa itu Mutex ?

Mutex atau Mutual exclusion merupakan sebuah mekanisme yang di gunakan untuk mengunci dan membuka kunci, yang di maksud mengunci dan membuka kunci ialah sebuah data.

Saya akan berikan contoh di projek yang nyata.

Anggap aja kita punya rekening di bank dengan saldo 1 Juta. Pada saat ini kita akan menyetor uang ke rekening tersebut sebanyak 300 ribu. Pada saat yang bersamaan akan ada proses lain yaitu terdapat tagihan bulan yang otomatis terambil dari saldo rekening sebanyak 400 ribu.

Baca Juga : Belajar Golang #28 : Menggunakan WaitGroup

Nah dari kondisi di atas ketika data tidak di kunci saat menyetor maka saldo akhir hanya 600 padahal sudah di setor 300 ribu. Dengan menggunakan mutex dapat mengunci data ketika menyetor sebanyak 400 ribu dan saldo setelah itu 1,4 juta, lalu akan di ambil untuk bayar tagihan sebesar 300 ribu. Artinya saldo akhir sesuai dengan proses keluar masuk uang yaitu 900 ribu.

Kenapa Harus menggunakan Mutex ?

Saya akan berikan contoh program golang sederhana di bawah ini, biar kode yang membuktikan.

main.go

Hasilnya :

Belajar Golang #29 : Memahami Penggunaan Mutex

Ketika kita melihat program di atas, maka kita sudah bisa menerka hasil dari proses kode di atas yaitu 500, dimana fungsi yang di jadikan sebuah goroutine digunakan untuk menjumlahkan angka.

Namun apa yang terjadi ?

Data yang di hasilkan bukanlah 500, namun 436. Data menjadi lebih kacau karena berjalan secara bersamaan.

Baca Juga : Belajar Golang #23 : Perbedaan Concurrency dan Parallelism

Bayangkan ketika goroutine jalan 2 kali, maka akan di anggap nilainya hanya bertambah 1. Dan hasil yang di dapatkanpun tidak mungkin melebihi jumlah perulangan.

Lalu bagaimana agar data sesuai dengan hasil yang benar.

Mari kita bahas di contoh penggunaan mutex di golang.

Contoh Penggunaan Mutex

Perintah mutex hanya ada 2 yaitu lock() dan unlock(). Dimana data yang di proses di apit oleh kedua sintaks tersebut.

main.go

Hasilnya :

Belajar Golang #29 : Memahami Penggunaan Mutex
Contoh Penggunaan Mutex di Golang

Perhatikan kode di atas, di dalam struct saya menambahkan type field sy dengan tipe Mutex.

Dimana penggunaan mutex di gunakan pada fungsi tambah(), mutex digunakan untuk mengapit program yang di inginkan. Dalam contoh di atas yaitu nilai counter dari penjumlahan. Maka perulangan yang ada di dalam fungsi main() di ulang sebanyak 500 kali dan setiap perulangannya di kunci dengan mutex.

Contoh Mutex dalam Projek Nyata

Masih belum paham dengan mutex di atas. Kalau belum mari kita coba lagi membuat latihan mutex dengan kasus lainnya.

Contoh latihan kedua ini contoh real secara nyata yaitu tentang keluar masuk uang di rekening.

mari kita lihat contoh di bawah ini.

main.go

Hasilnya :

Belajar Golang #29 : Memahami Penggunaan Mutex
Contoh Mutex di Golang dalam Projek Nyata

Perhatikan kode di atas, terdapat 2 buah goroutine yaitu menambah dan mengurangi saldo. Saldo awal yaitu 1000.

Di dalam goroutine tambahSaldo() digunakan untuk menambah nilai dari saldo awal. Sedangkan di kurangiSaldo() di gunakan untuk mengurangi saldo.

Di dalam kedua fungsi menggunakan mutex, dimana setiap nilai di dalam goroutine harus di kunci dulu agar tidak kehilangan data yang lain, dalam hal ini saldo akhir.

Sekian tutorial golang yang membahas mengenai mutex. Terima Kasih.

Leave a Reply