Mutex -> digunakan untuk mengatasi race condition -> locking dan unlocking
Dimana ketika kita melakukan locking terhadap mutex, maka tidak ada yang bisa melakukan locking lagi sampai kita melakukan unlock.
Jika ada beberapa goroutine melakukan lock terhadap Mutex, maka hanya 1 goroutine yang dieksekusi, setelah goroutine tersebut melakukan unlock, baru goroutine selanjutnya melakukan lock lagi.
Kekurangan -> ada kemungkinan beberapa go routine saling menggu untuk melakukan lock -> bisa menimbulkan deadlock.
packagemainimport ("fmt""sync")var wg sync.WaitGroupvar m sync.Mutexfuncf(v *int, wg *sync.WaitGroup) { m.Lock()*v++ m.Unlock() wg.Done()}funcmain() {var v int=0for i :=0; i <1000; i++ { wg.Add(1)gof(&v, &wg) } wg.Wait() fmt.Println("Finished", v)}
Finished 1000
packagemainimport ("fmt""sync")var wg sync.WaitGroupvar m sync.Mutexfuncf(v *int, wg *sync.WaitGroup) { m.Lock()*v++ m.Unlock() wg.Done()}funcmain() {var v int=0for i :=0; i <10000; i++ { wg.Add(1)gof(&v, &wg) } wg.Wait() fmt.Println("Finished", v)}
Finished 10000
packagemainimport ("fmt""sync")var wg sync.WaitGroupvar m sync.Mutexfuncmain() {var v int=0for i :=0; i <10000; i++ { wg.Add(1)gofunc() { m.Lock() v++ m.Unlock() wg.Done() }() } wg.Wait() fmt.Println("Finished", v)}