GO外文翻译计划golang.org/doc/effecti…
并发编程是一个很大的主题,这里只留出了一些特定于go的重点内容。
在许多环境中,由于实现对共享变量的正确访问所需的细微差别,并发编程变得很困难。Go鼓励一种不同的方法,共享值在通道上传递,实际上,从来不会被单独的执行线程主动共享。在任何给定时间,只有一个goroutine可以访问该值。根据设计,数据竞争不会发生。为了鼓励这种思维方式,我们把它简化为一句简单易懂的总结:
不要通过共享内存进行通信;相反,应该通过通信来共享内存。
这种方法可能会走得太远。例如,最好的方法是在一个整型变量周围放置一个互斥锁。但作为一种高级方法,使用通道来控制访问使编写清晰、正确的程序更容易。
考虑这个模型的一种方法是考虑在一个CPU上运行的一个典型的单线程程序。它不需要同步原语。现在运行另一个这样的实例;它也不需要同步。现在让他们俩交流一下;如果通信是同步器,仍然不需要其他同步。例如,Unix管道就非常适合这个模型。虽然Go的并发方法起源于Hoare的通信顺序进程(CSP),但它也可以被视为Unix管道的类型安全泛化。