一、临界资源
临界资源: 指并发环境中多个进程/线程/协程共享的资源。
但是在并发编程中对临界资源的处理不当, 往往会导致数据不一致的问题。
示例代码:
package main
import (
"fmt"
"time"
)
func main() {
a := 1
go func() {
a = 2
fmt.Println("子goroutine。。",a)
}()
a = 3
time.Sleep(1)
fmt.Println("main goroutine。。",a)
}
我们通过终端命令来执行:
能够发现一处被多个goroutine共享的数据。
二、临界资源安全问题
并发本身并不复杂,但是因为有了资源竞争的问题,就使得我们开发出好的并发程序变得复杂起来,因为会引起很多莫名其妙的问题。
如果多个goroutine在访问同一个数据资源的时候,其中一个线程修改了数据,那么这个数值就被修改了,对于其他的goroutine来讲,这个数值可能是不对的。
举个例子,我们通过并发来实现火车站售票这个程序。一共有100张票,4个售票口同时出售。
我们先来看一下示例代码:
package main
import (