在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
在多个线程对同一个变量进行了读写操作的时候,由于不同的goroutine的执行顺序不能确定,可能会为程序带来不可预测的后果。要保证程序的并发安全,需要使用锁机制。 go内存模型确定了在何种条件下一个goroutine中的read操作可以观测到另一个goroutine中的write操作。 对于在不同的goroutine中操作的数据应该用channel保护起来,或者用其他同步机制,比如sync或者sync/atomic包。
用channel实现的版本,channel保证对对通道c的写入发生在读取之前,本质上chan也是用锁来实现的。
在上面的例子中,如果c是一个缓冲通道,则不能保证,这是由channel的底层实现决定的,从$GOROOT/src/runtime/chan.go中可以看到
下面摘自 Gopher 2017大会上Kavya的PPT
当一个goroutine向channel中写入数据的时候,
同样的,一个goroutine从channel中读取数据的时候,
向一个已经关闭的channel发送数据会引发panic,关闭一个已经关闭的channel也会引发panic。 从一个已经关闭的channel中读取数据不会引发Panic,会读出一个zero value,为了避免死循环,在读出channel时应该判断channel是否关闭。
当所有的goroutine都停止或者处于阻塞的时候,主线程还未退出,会引发死锁。 |
请发表评论