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.
1func main() {
2 var x int = 0
3 for i := 0; i < 1000; i++ {
4 go func() {
5 x++
6 }()
7 }
8
9 time.Sleep(500 * time.Microsecond)
10 fmt.Println("counter : ", x)
11}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.
1func main() {
2 var x int = 0
3 var mu sync.Mutex
4 for i := 0; i < 1000; i++ {
5 go func() {
6 mu.Lock()
7 x++
8 mu.Unlock()
9 }()
10 }
11
12 time.Sleep(500 * time.Microsecond)
13 fmt.Println("counter : ", x)
14}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.