go
文章平均质量分 91
golang学习记录
lkness
学不见其长,但日有所增
展开
-
sync.Map源码解析
sync.Map是golang内置的并发安全hash表存储类型,可以多协程并发读写。Map设计为两个map(map源码解析)来分别负责读和写,读操作先从read map中查找,查找不到再加锁去dirty map查找,一旦下沉到dirty map查找的话,misses次数就会变多,达到一个次数就表示dirty map存在太多的key没在read map里,这时候把read map直接切换到dirty map指向,就完成了两个map切换。原创 2023-03-29 12:27:28 · 404 阅读 · 0 评论 -
channel源码解析
csp模型是golang采用的共享内存模型,比对传统多线程共享内存采用lock、condition等方式来规定执行顺序的方式,golang里的csp更强调信道(channel),不关心信道发送、接收方是谁,双方通过信道收发信息。**ps:**和csp模型对应的actor模型,强调通信中的角色(actor),即收发双方,不看重通道。并且角色对外不提供任何接口访问,只约定通过通信异步交换信息,发送方必须知道接收方是谁,例如一个人要给另个人传递消息通过给对方的邮箱写信或者发短信。原创 2023-03-29 10:48:25 · 28864 阅读 · 0 评论 -
map源码解析
map是golang内置常用的哈希表结构,可以多线程读,但多线程一旦写操作就会程序崩溃。hmap就是map的底层结构。key通过hash与桶数组buckets长度取模得到具体桶,再遍历桶上溢出桶链表查找冲突的key,其结构如下:fill:#333;color:#333;color:#333;fill:none;溢出桶n溢出桶2溢出桶1数组桶2^B个数组结构存放8个kv对,next指针指向下个溢出桶溢出桶数组结构存放8个kv对,next指针指向下个溢出桶溢出桶。原创 2023-03-29 10:03:45 · 576 阅读 · 0 评论