Go 源码深度解析之 chan(环形队列/创建/发送/接收/关闭)
一、简介
写在前面:先写个结论,让大家对该结构的源码有个大概了解,之后再一步一步解析源码。
chan 提供了一种在 goroutine 之间进行数据交换和同步的方式。通道可以用于控制并发访问和共享数据,从而减少竞态条件和死锁问题,并且可以自然地处理异步事件和信号。如果你的应用程序需要在 goroutine 之间传递数据或消息,那么通道是一个不错的选择
写在前面:先写个结论,让大家对该结构的源码有个大概了解,之后再一步一步解析源码。
chan 提供了一种在 goroutine 之间进行数据交换和同步的方式。通道可以用于控制并发访问和共享数据,从而减少竞态条件和死锁问题,并且可以自然地处理异步事件和信号。如果你的应用程序需要在 goroutine 之间传递数据或消息,那么通道是一个不错的选择
写在前面:先写个结论,让大家对该结构的源码有个大概了解,之后再一步一步解析源码:
type RWMutex struct {
w Mutex // 写锁
writerSem uint32 // 缓冲信号量,获取写锁的阻塞等待信号队列
readerSem uint32 // 缓冲信号量,获取读锁的阻塞等待信号队列
readerCount int32 // 当前持有读锁的 goroutine 数量,负数表示有个写锁在执行
readerWait int32 // 获取写锁时,如果之前还有 readerWait 数量的读锁在执行,则需要等待执行完才能获取写锁
}w
写在前面:先写个结论,让大家对该结构的源码有个大概了解,之后再一步一步解析源码:
锁不可复制:拷贝互斥锁同时会拷贝锁的状态,容易造成死锁
不是可重入锁,并且一个协程上锁,可以由另外一个协程解锁
写在前面:先写个结论,让大家对该结构的源码有个大概了解,之后再一步一步解析源码:
sync.Map 是并发安全的,内部采用读(read)写(dirty)分离,常用于 多读少写 场景
写在前面:先写个结论,让大家对该结构的源码有个大概了解,之后再一步一步解析源码。
map 是一种非常常见的数据类型,它可以用于快速地检索数据;是一种 key-value 结构的数据类型,key 是唯一的,value 可以重复
写在前面:先写个结论,让大家对该结构的源码有个大概了解,之后再一步一步解析源码:
slice是引用类型,底层是一个指向指针的数组,支持动态扩容