一、Go协程、匿名函数、闭包
引用外部变量,容易因为go协程运行慢的问题导致变量变化,结果受影响。
二、并发原语condition variable (类似Java中的Condition锁的wait() notify())
// 线程
mu.Lock()
// do something that might affect the condition
cond.Broadcast()
mu.Unlock()
----
// 等待线程
mu.Lock()
while condition == false {
cond.Wait()
}
// now condition is true, and we have the lock
mu.Unlock()
broadcast 会唤醒通知队列中所有阻塞的线程,而如果用 signal,那就只唤醒通知队列中第一个阻塞进程(即最早阻塞的进程)。signal 使用得好性能更高,但是 broadcast 适用范围更广。
三、不要在RPC调用期间持有锁。
四、Debug
1.封装的DPrintf方法用来打桩
2.ctrl + \,Go 退出信号,退出所有协程并打印 stacktrace,从stacktrace 中就能找到可能出问题的地方。
3.打开 race 检测是否有并发冲突。