pemrograman

Cara Membuat Mutex Dan Kegunaannya Pada Golang

Pengenalan Sync.Mutex

Mutex atau kepanjangan dari Mutual Exclusion adalah suatu cara untuk mengatasi race condition di dalam bahasa Golang. Mutex bisa digunakan untuk melakukan locking and unlocking terhadap suatu mutex sehingga jika sudah di lock maka tidak akan bisa melakukan locking lagi sampai kita melakukan unlocking.

Sehingga jika kita memiliki goroutine melakukan lock maka goroutine yang lain tidak akan bisa melakukan lock sampai goroutine tersebut melakukan unlock, maka baru goroutine yang lain bisa melakukan lock. Ini sangat cocok atau biasanya jadi solusi ketika ada masalah race condition yang dihadapi saat kita sedang ngoding.

Masih bingung? Baik nanti kita akan coba lebih lanjut ke sampel pembuatan Mutex ini.

Masalah Race Condition

Kita akan coba buat simple kode yang menjadikan kode tersebut terdapat Race Condition. Bisa lihat kode dibawah ini.

func main() {
	var x int = 0
	for i := 0; i < 1000; i++ {
		go func() {
			x++
		}()
	}

	time.Sleep(500 * time.Microsecond)
	fmt.Println("counter : ", x)
}

Maka, kita lihat kode diatas jika dijalankan akan mengeluarkan println dengan nilai counter yang berbeda-beda. Kenapa bisa begitu? Karena pada kode tersebut terjadi Race Condition dimana variable x ini akan bersamaan set dan yang terakhir set itu adalah goroutine yang berbeda-beda.

Cara Mengatasi Race Condition dengan sync.Mutex

Lalu bagaimana cara untuk menghindari Race Condition yaitu salah satunya dengan penggunaan Mutex ini. Yuk kita ubah kode diatas lalu tambahkan dengan penggunaan Mutex dengan lihat kode tambahannya dibawah ini.

func main() {
	var x int = 0
	var mu sync.Mutex
	for i := 0; i < 1000; i++ {
		go func() {
			mu.Lock()
			x++
			mu.Unlock()
		}()
	}

	time.Sleep(500 * time.Microsecond)
	fmt.Println("counter : ", x)
}

Saat kita menjalankan kode diatas, maka setiap keluarannya akan tetap yaitu 1000, sehingga hitungannya pun sudah benar dan tidak berbeda-beda ketika sebelum kita menggunakan sync.Mutex.

Maka ini sangat berguna sekali jika kita sedang mengerjakan suatu kode hitungan yang menggunakan goroutine dan melakukan setter ke dalam variabel yang sama dalam waktu yang bersamaan maka kita perlu menggunakan sync.Mutex sebagai locking and unlock agar variabel tersebut perhitungannya benar dan reliable.

comments powered by Disqus