Search⌘ K

Puzzle 22 Explanation: Go Count

Explore the concept of race conditions in Go and understand why atomic operations matter. Learn to detect races with Go's race detector and fix concurrency issues using sync.Mutex or the sync/atomic package to write safer, more efficient code.

We'll cover the following...

Try it yourself

Try executing the code below to see the result.

Go (1.16.5)
package main
import (
"fmt"
"sync"
)
func main() {
var count int
var wg sync.WaitGroup
for i := 0; i < 1_000_000; i++ {
wg.Add(1)
go func() {
defer wg.Done()
count++
}()
}
wg.Wait()
fmt.Println(count)
}

Explanation

What we have here is a race condition. We don’t have an atomic operation, which means the code to increment an integer is interrupted mid-operation. Besides, there is the memory barrier. To speed things up, modern computers try to fetch values from a CPU cache before going the long way to the main memory. ...