- 只须在函数调用前添加go关键字即可创建并发任务
- 关键字go并非执行并发操作,而是创建一个并发任务单元。新建任务被放置在系统队列中,等待调度器安排合适系统线程去获取执行权。当前流程不会阻塞,不会等待该任务启动,且运行时也不保证并发任务的执行次序
- 运行时可能会创建很多线程,但任何时候仅有有限的几个线程参与并发任务执行。该数量默认与处理器核数相等,可用runtime.GOMAXPROCS函数(或环境变量)修改。如参数小于1,GOMAXPROCS仅返回当前设置值,不做任何调整
- 尽管可用make创建单向通道,但那没有任何意义。通常使用类型转换来获取单向通道,并分别赋予操作双方。不能在单向通道上做逆向操作,同样,close不能用于接收端。无法将单向通道重新转换回去
func main() { c := make(chan int, 2) var recv <-chan int = c close(recv) // 无效操作:close(recv) (cannot close receive-only channel) }
- 将发往通道的数据打包,减少传输次数,可有效提升性能。从实现上来说,通道队列依旧使用锁同步机制,单次获取更多数据(批处理),可改善因频繁加锁造成的性能问题
- mutex不支持递归锁,即便在同一goroutine下也会导致死锁
- 将mutex作为匿名字段时,相关方法必须实现为pointer-receiver,否则会因复制导致锁机制失效