Go 利用channels实现协程数据通信的坑

Go 并发性是 通过 channels 建立在CSP 上的,它使用 channel 使得协调 goroutines 比在共享数据上同步更简单和安全。老话说的是「不要通过共享内存来通信;而应该通过通信来共享内存」。

Go 没办法获得不可变的数据结构。这意味着一旦我们在 channel 上发送一个指针,就gameover: 因为在并发进程之间共享了可变的数据,就会导致数据的混乱

当然,一个 channel 的结构是赋值 channel 传送的值(而不是指针),但是我们一定要保证发送给channel的是不可变的数据类型;

一定要注意那些没有深度复制的引用,包括 slices 和 maps 本质上都是可变的,与接口类型的 struct 字段相同:它们是指针,接口定义的任何可变方法都是对竞争条件的开放。

因此,尽管 channels 表面上使并发编程变得容易,但它们并不能阻止共享数据上的竞争条件。而 slices 和 maps 本身的可变性使这种情况更有可能发生。

猜你喜欢

转载自blog.csdn.net/QiuHaoqian/article/details/108997438