xxxxxxxxxx
/*
* sync.Mutex adalah sebuah sync primitive library bawaan go, yang digunakan untuk melakukan mekanisme penguncian data, yang dimana untuk memastikan hanya satu fungsi atau goroutine saja yang dapat mengakses data tersebut dalam waktu yang bersamaan,
lock itu ibarat setter dan unlock itu ibarat getter, biasa nya pengunaan mutex itu sendiri digunakan untuk menghandle ketika ada sebuah process yang mengalami race condition, simplenya race condition adalah dimana ada 2 buah fungsi yang mengakses data tersebut secara bersamaan dalam 1 waktu,
sehingga terjadilah race condition, perlu di ingant jika anda hanya menggunakan lock tanpa unlock maka yang terjadi aplikasi anda bisa crash, yang dimana anda mengeset data tersebut untuk di panggil, tetapi ketika datanya sudah di terpenuhi anda tindak panggil.
*/
package main
import (
"fmt"
"runtime"
"sync"
)
type counter struct {
sync.Mutex
val int
}
func (c *counter) Add(x int) {
c.Lock()
c.val++
c.Unlock()
}
func (c *counter) Value() (x int) {
return c.val
}
func main() {
runtime.GOMAXPROCS(2)
var wg sync.WaitGroup
var mtx sync.Mutex
var meter counter
for i := 0; i < 1000; i++ {
wg.Add(1)
go func() {
for j := 0; j < 1000; j++ {
mtx.Lock()
meter.Add(1)
mtx.Unlock()
}
wg.Done()
}()
}
wg.Wait()
fmt.Println(meter.Value())
}