Go语言并发编程:同步与上下文管理
1. 并发执行的随机性
在Go语言中,并发执行的程序会呈现出随机性。例如,运行某些并发程序时,打印的数字顺序是随机的。这是因为在并发环境下,无法确定一个调度好的函数何时会执行。在任意时刻,可能有0到10个goroutine在执行 fmt.Println(x) ,还有一个在执行 fmt.Println("hello") ,而且 main() 函数本身也是一个goroutine。当 for 循环结束后, fmt.Println("hello") 会执行,但它可能在所有数字之前、中间或者之后被打印出来,就像赛道上的马一样,虽然知道所有马都会到达终点,但不知道哪一匹会最先到达。
2. 同步规则与方法
在进行并发编程时,有一个简单的规则:可以在不同步的情况下并发读取变量,但单个写入者需要同步。Go语言中常见的同步方法有:
- 通道(Channel) :用于在goroutine之间交换数据。
- 互斥锁(Mutex)和读写锁(RWMutex) :来自 sync 包,用于锁定数据访问。
- 等待组(WaitGroup) :来自 sync 包,用于跟踪访问。
这些方法可以防止多个goroutine同时读写变量。如果尝试从多个goroutine同时读写同一个变量,结果是未定义的,这被称为数据
超级会员免费看
订阅专栏 解锁全文

被折叠的 条评论
为什么被折叠?



