代码
package main
import (
"fmt"
"sync"
)
var a = 1
func main() {
lock := sync.Mutex{}
wg := &sync.WaitGroup{}
wg.Add(2)
go t(lock,wg)
go t(lock,wg)
wg.Wait()
fmt.Println(a)
}
func t(lock sync.Mutex, wg *sync.WaitGroup){
defer wg.Done()
lock.Lock()
defer lock.Unlock()
for i:=0;i<10000000;i++{
a++
}
}
输出
11380825
修正
代码
package main
import (
"fmt"
"sync"
)
var a = 1
func main() {
lock := &sync.Mutex{}
wg := &sync.WaitGroup{} // 改成指针
wg.Add(2)
go t(lock,wg)
go t(lock,wg)
wg.Wait()
fmt.Println(a)
}
func t(lock *sync.Mutex, wg *sync.WaitGroup){ // 改成指针
defer wg.Done()
lock.Lock()
defer lock.Unlock()
for i:=0;i<10000000;i++{
a++
}
}
结果
20000001
这才是正确的结果
结论
函数参数传递sync.Mutex一定要是指针