倡议
对于多协程同时批改的数据,要确保序列化拜访。
能够通过Channel和其余同步机制(sync和sync/atomic包)来爱护数据,以保障序列化拜访。
Happens-Before准则
同JMM,保障单协程程序程序准则。
如果事件e1是happens-before事件e2,那么事件e2也happens-after事件e1。如果事件e1不是happens-before事件e2也不是happens-after事件e2,那么事件e1和事件e2被认为并发产生(concurrently)。
对变量v的读操作r可能察看到写操作w必须满足:
- 读操作r不happens-before写操作w。
- 没有其它的写操作happens-after写操作w和happens-before读操作r。
对变量v的读操作r确保察看到写操作w必须满足:
- 写操作w必须happens-before读操作r。
- 其余对变量v的写操作要么happens-before写操作w,要么happens-after读操作r。
在内存模型中,对变量v的零值初始化被认为是写操作。超过一个机器字值的读操作和写操作,体现为无指定程序的多个机器字大小的操作。
Go Channel
发送happens-before接管
敞开happens-before因管道敞开而返回0的接管
无缓冲管道:承受happens-before发送
容量为C的缓冲管道:第k个接管happens-before第k+C个发送
Locks
n<m: 第n个Unlock() happens-before 第m个Lock()
Once
多个线程都能够执行once.Do(f),然而只有一个会运行f(),该f()的调用happens-before所有once.Do(f)的返回。