首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Go语言基础知识之锁

在前面我们已经讲了如何使用 channel 在多个 goroutine 之间进行通信,其实对于并发还有一种较为常用通信方式,那就是共享内存。

首先我们来看一个例子:

运行程序,可以得到类似输出结果:

可以看到在两个 goroutine 中我们都可以访问 这个变量,当修改它后,在不同的 goroutine 中都可以同时获取到最新的值。

这就是一个最简单的通过共享变量(内存)的方式在多个 goroutine 进行通信的方式。

下面再来看一个例子:

多次运行代码,可以得到类似输出:

可以看到当我们并发对同一个切片进行写操作的时候,会出现数据不一致的问题,这就是一个典型的共享变量的问题。

针对这个问题我们可以使用 Lock(锁)来修复,从而保证数据的一致性,例如:

修改过后,我们再次运行代码,可以看到最后的 numbers 都会包含 0~9 这个10个数字。

是互斥锁,只有一个信号标量;在 Go 中还有一种读写锁 ,对于我们的共享对象,如果可以分离出读和写两个互斥信号的情况,可以考虑使用它来提高读的并发性能。

例如代码:

运行代码可以得到如下结果:

可以看到使用 的读的并发能力大概是 的十倍,从而大大提高了其并发能力。

总结:

我们可以通过共享内存的方式实现多个 goroutine 中的通信。

多个 goroutine 对于共享的内存进行写操作的时候,可以使用 来避免数据不一致的情况。

对于可以分离为读写操作的共享数据可以考虑使用 来提高其读的并发能力。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180323G1FV3N00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券