看起来您正在正确使用锁,但在打印之前没有等待goroutines“完成”
arr
.尝试添加一个小
<-time.After(time.Second)
,或使用WaitGroup,或使用
select
等待所有Goroutine完成,或放置
fmt.Println(ar[i].population)
在goroutines内查看您想要看到的结果!
如果你只是开始一系列的goroutines而不等待它们完成,同样的事情也会发生。
这里是一个完整的工作示例,为了清晰起见,每个goroutine都有一个额外的“id”。请注意,goroutines的顺序不一致!
package main
import (
"fmt"
"sync"
"time"
)
type locks_block struct {
population int
mux sync.Mutex
}
func incr(id int, ar []locks_block) {
for i := 0; i < len(ar); i++ {
ar[i].mux.Lock()
ar[i].population = ar[i].population + 1
fmt.Printf("goroutine #%v, population %v\n", id, ar[i].population)
ar[i].mux.Unlock()
}
}
func main() {
arr := make([]locks_block, 5)
go incr(1, arr)
go incr(2, arr)
go incr(3, arr)
go incr(4, arr)
// this should give the goroutines enough time
<-time.After(time.Millisecond * 500)
fmt.Println(arr)
}