Go
42 篇笔记
- 2.8 sync.Mutexhistorical
1. Mutex是什么 - 互斥锁 - 实现了Locker接口,zero-value是没加锁的状态 - 加锁解锁可以在不同的goroutine中 2. 使用 2.1. 不使用Mutex的情况 2.2. 使用Mutex的情况
- 2.9 sync.RWMutexhistorical
1. 是什么 - 实现了Locker接口,是个读写锁 - Lock , RLock 分别用于加写锁和读锁 - Unlock , RUnlock 分别用于解写锁和读锁 2. 使用
- 2.10 sync.Condhistorical
1. 是什么 - 条件变量。Locker和Cond的关系类似于Java中Lock和Condition的关系。 - 所有方法必须持有Lock才能调用 - func NewCond(l Locker) Cond 使用Lock创建一个Cond - func (c Cond) Wait() 自动释放Lock
- 2.11 atomichistorical
1. atomic是什么 原子性 - 一个或多个操作要么全部执行,要么全部不执行。 - 最小的不可并行化的操作,就是同一时刻最多只有一个并发体对资源进行操作 - 一般情况下,原子操作都是通过“互斥”访问来保证的,通常由特殊的CPU指令提供保护 2. atomic value是什么 atomic包把底
- 2.12 channelhistorical
1. CSP并发模型 - 从内存的角度看,并行计算只有两种: 共享内存 、 消息通信 - 基于共享内存的并发模型通常提供互斥锁作为同步原语 - CSP 全称是 “Communicating Sequential Processes”,是一种基于消息通信的并发模型,由Tony Hoare于1977年提
- 2.13 concurrenthistorical
1. 有什么 1.1. goroutine+channel - goroutine.md - channel.md 1.2. sync包 sync.md 2. 同步 2.1. 顺序一致性模型 同一个Goroutine线程内部,顺序一致性内存模型是得到保证的 2.2. happens-before 不
- 2.14 goroutinehistorical
1. goroutine是什么 - 程序、进程、线程.md - Go语言实现的用户线程 - 相比较于线程,goroutine - 创建、销毁和切换:都在用户态完成无需进入内核 - 内存占用:默认栈大小为2K,并且可以动态扩缩容 2. goroutine使用 2.1. 创建协程 - go f(x, y
- 2.15 协程池historical
1. 协程池是什么 复用goroutine的池子 2. 为什么需要协程池 跟如何设计池化技术.md不同,由于 goroutine创建、销毁对象开销小:创建销毁是在用户态, goroutine数量理论上可以无限,一个goroutine占用内存仅仅不到2K 所以99%的情况下不需要协程池 但是在极限情况
- 3.1 GMPhistorical
1. goroutine调度器 - Golang中协程的调度模型,即有M个线程,N个协程,该怎么分配协程给线程执行 - 这个本质上和操作系统的调度器类似,即有M个处理器,N个线程,怎么分配处理器给线程执行 1.1. GM模型 - 最开始采用的是GM模型 - G:goroutine,M:内核线程 -
- 3.2 逃逸分析historical
1. 逃逸分析 如果是Java或C++创建出来的对象一般都是分配在堆上的,而Golang new出来的对象会根据逃逸分析决定是分配在堆还是栈上 2. 为什么需要逃逸分析 堆 栈 --- ----------- ------------- 回收 需要垃圾回收 退出函数即销毁 空间 大 小 3. 如何逃