1:使用互斥锁,将公共资源锁住,只能一个goroutine进行使用,使用完成之后,进行解锁,解锁之后,才能可以让下一个goroutine进行使用
package main
import (
"fmt"
"sync"
"time"
)
func main() {
var lock sync.Mutex
var i int = 1
go func() {
lock.Lock()
fmt.Println("func2初始状态", i)
i++
defer lock.Unlock()
}()
go func() {
lock.Lock()
fmt.Println("func1初始状态 ", i)
for n := 0; n < 100; n++ {
i++
}
defer lock.Unlock()
fmt.Println(i)
}()
time.Sleep(time.Second)
}
一个小例子,就可以说明,两个goroutine
两种可能性
- 先执行第func1,则会将i锁住,当func2进行访问时,不能成功访问。当func1加到100时,也会自动进行解锁,此时func2才能访问到
- 先执行func2,同理func1不能成功访问,但是func2将i增加到1时,会自动进行解锁,此时,func1才能进行访问值,并更改值