线程不安全的版本
package main
import (
"fmt"
"runtime"
"sync"
)
var (
count int32
wg sync.WaitGroup
)
func main() {
wg.Add(2)
go addValue()
go addValue()
wg.Wait()
fmt.Println(count)
}
func addValue() {
defer wg.Done()
for i := 0; i < 2; i++ {
value := count
runtime.Gosched()
value++
count = value
}
}

线程安全的版本
package main
import (
"fmt"
"runtime"
"sync"
)
var (
count int32
wg sync.WaitGroup
mutex sync.Mutex
)
func main() {
wg.Add(2)
go addValue()
go addValue()
wg.Wait()
fmt.Println(count)
}
func addValue() {
defer wg.Done()
for i := 0; i < 2; i++ {
mutex.Lock()
value := count
runtime.Gosched()
value++
count = value
mutex.Unlock()
}
}

使用atomic
package main
import (
"fmt"
"sync"
"sync/atomic"
)
var (
count int32
wg sync.WaitGroup
mutex sync.Mutex
)
func main() {
wg.Add(2)
go addValue()
go addValue()
wg.Wait()
fmt.Println(count)
}
func addValue() {
defer wg.Done()
for i := 0; i < 200; i++ {
atomic.AddInt32(&count, 1)
//runtime.Gosched()
}
}
