diff --git a/categories/go.md b/categories/go.md index 78a8cff..3953caa 100644 --- a/categories/go.md +++ b/categories/go.md @@ -63,10 +63,56 @@ ch := make(chan Task, 3) ## Sync ### atomic + ### Mutex - - sync.Mutex() - - mutex.Lock() - - mutx.Unlock() + + - sync.Mutex() + - mutex.Lock() + - mutx.Unlock() + +```go +package main + +import ( + "fmt" + "sync" + "time" +) + +// SafeCounter is safe to use concurrently. +type SafeCounter struct { + v map[string]int + mux sync.Mutex +} + +// Inc increments the counter for the given key. +func (c *SafeCounter) Inc(key string) { + c.mux.Lock() + // Lock so only one goroutine at a time can access the map c.v. + c.v[key]++ + c.mux.Unlock() +} + +// Value returns the current value of the counter for the given key. +func (c *SafeCounter) Value(key string) int { + c.mux.Lock() + // Lock so only one goroutine at a time can access the map c.v. + defer c.mux.Unlock() + return c.v[key] +} + +func main() { + c := SafeCounter{v: make(map[string]int)} + for i := 0; i < 1000; i++ { + go c.Inc("somekey") + } + + time.Sleep(time.Second) + fmt.Println(c.Value("somekey")) +} +``` + + ### RWMutex > A RWMutex is a reader/writer mutual exclusion lock. The lock can be held by an arbitrary number of readers or a single writer. The zero value for a RWMutex is an unlocked mutex.