mirror of
https://github.com/teivah/100-go-mistakes.git
synced 2026-06-24 02:16:55 +08:00
82 lines
738 B
Go
82 lines
738 B
Go
package races
|
|
|
|
import (
|
|
"sync"
|
|
"sync/atomic"
|
|
)
|
|
|
|
func listing1() {
|
|
i := 0
|
|
|
|
go func() {
|
|
i++
|
|
}()
|
|
|
|
go func() {
|
|
i++
|
|
}()
|
|
}
|
|
|
|
func listing2() {
|
|
var i int64
|
|
|
|
go func() {
|
|
atomic.AddInt64(&i, 1)
|
|
}()
|
|
|
|
go func() {
|
|
atomic.AddInt64(&i, 1)
|
|
}()
|
|
}
|
|
|
|
func listing3() {
|
|
i := 0
|
|
mutex := sync.Mutex{}
|
|
|
|
go func() {
|
|
mutex.Lock()
|
|
i++
|
|
mutex.Unlock()
|
|
}()
|
|
|
|
go func() {
|
|
mutex.Lock()
|
|
i++
|
|
mutex.Unlock()
|
|
}()
|
|
}
|
|
|
|
func listing4() {
|
|
i := 0
|
|
ch := make(chan int)
|
|
|
|
go func() {
|
|
ch <- 1
|
|
}()
|
|
|
|
go func() {
|
|
ch <- 1
|
|
}()
|
|
|
|
i += <-ch
|
|
i += <-ch
|
|
}
|
|
|
|
func listing5() {
|
|
i := 0
|
|
mutex := sync.Mutex{}
|
|
|
|
go func() {
|
|
mutex.Lock()
|
|
defer mutex.Unlock()
|
|
i = 1
|
|
}()
|
|
|
|
go func() {
|
|
mutex.Lock()
|
|
defer mutex.Unlock()
|
|
i = 2
|
|
}()
|
|
|
|
_ = i
|
|
}
|