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.