在之前的示例中,我们使用显式锁定与 互斥锁 来同步多个 Goroutine 对共享状态的访问。另一种选择是使用 Goroutine 和通道的内置同步功能来实现相同的结果。这种基于通道的方法符合 Go 的理念,即通过通信来共享内存,并让每个数据块由一个 Goroutine 独占。 |
|
|
|
|
|
在本示例中,我们的状态将由单个 Goroutine 拥有。这将保证数据永远不会因并发访问而损坏。为了读取或写入该状态,其他 Goroutine 将向拥有 Goroutine 发送消息并接收相应的回复。这些 |
|
|
|
与之前一样,我们将计算执行的操作数量。 |
|
|
|
以下是拥有 |
|
这将启动 100 个 Goroutine,通过 |
|
我们也启动了 10 次写入,使用类似的方法。 |
|
让 Goroutine 工作一秒钟。 |
|
最后,捕获并报告操作计数。 |
|
运行我们的程序表明,基于 Goroutine 的状态管理示例完成了大约 80,000 次总操作。 |
|
对于这种情况,基于 Goroutine 的方法比基于互斥锁的方法稍微复杂一些。但是,它在某些情况下可能有用,例如,当您有其他通道参与或管理多个此类互斥锁会容易出错时。您应该使用感觉最自然的方法,尤其是在理解程序正确性方面。 |
下一个示例:排序.