前言

哈喽,大家好,我是asong。今天与大家聊一个比较冷门的高频面试题,关于切片的,Go语言中的切片原生支持并发吗?怎么样,心里有答案了嘛,带着你的思考我们一起来看一看这个知识点。

实践检验真理

实践是检验真理的唯一标准,所以当我们遇到一个不确定的问题,直接写demo来验证,因为切片的特点,我们可以分多种情况来验证:

  1. 不指定索引,动态扩容并发向切片添加数据

func concurrentAppendSliceNotForceIndex() {sl := make([]int, 0)wg := sync.WaitGroup{}for index := 0; index < 100; index++{k := indexwg.Add(1)go func(num int) {sl = append(sl, num)wg.Done()}(k)}wg.Wait()fmt.Printf("final len(sl)=%d cap(sl)=%d\n", len(sl), cap(sl))
}

通过打印数据发现每次的结果都不一致,先不急出结论,我们在写其他的demo测试一下;

  1. 指定索引,指定容量并发向切片添加数据

func concurrentAppendSliceForceIndex() {sl := make([]int, 100)wg := sync.WaitGroup{}for index := 0; index < 100; index++{k := indexwg.Add(1)go func(num int) {sl[num] = numwg.Done()}(k)}wg.Wait()fmt.Printf("final len(sl)=%d cap(sl)=%d\n", len(sl), cap(sl))
}

通过结果我们可以发现符合我们的预期,长度和容量都是100,所以说slice支持并发吗?

slice支持并发吗?

我们都知道切片是对数组的抽象,其底层就是数组,在并发下写数据到相同的索引位会被覆盖,并且切片也有自动扩容的功能,当切片要进行扩容时,就要替换底层的数组,在切换底层数组时,多个goroutine是同时运行的,哪个goroutine先运行是不确定的,不论哪个goroutine先写入内存,肯定就有一次写入会覆盖之前的写入,所以在动态扩容时并发写入数组是不安全的;

所以当别人问你slice支持并发时,你就可以这样回答它:

当指定索引使用切片时,切片是支持并发读写索引区的数据的,但是索引区的数据在并发时会被覆盖的;当不指定索引切片时,并且切片动态扩容时,并发场景下扩容会被覆盖,所以切片是不支持并发的~。

github上著名的iris框架也曾遇到过切片动态扩容导致webscoket连接数减少的bug,最终采用sync.map解决了该问题,感兴趣的可以看一下这个issue:https://github.com/kataras/iris/pull/1023#event-1777396646;

总结

针对上述问题,我们可以多种方法来解决切片并发安全的问题:

  1. 加互斥锁

  2. 使用channel串行化操作

  3. 使用sync.map代替切片

切片的问题还是比较容易解决,针对不同的场景可以选择不同的方案进行优化,你学会了吗?

好啦,本文到这里就结束了,我是asong,我们下期见。

Go语言切片原生支持并发吗?相关推荐

  1. Go 的切片支持并发吗?

    前言 哈喽,今天与大家聊一个比较冷门的高频面试题,关于切片的,Go语言中的切片原生支持并发吗?怎么样,心里有答案了嘛,带着你的思考我们一起来看一看这个知识点.本文转载自公众号「Golang梦工厂」,推 ...

  2. 使用Go语言实现高效的并发编程

    文章目录 概述 举个例子 使用并发编程来实现简单的任务处理 使用同步锁来避免竞态条件 使用信道来协调多个goroutine之间交互 总结 概述 Go语言支持并发编程.你可以通过创建多个并发单元(称为g ...

  3. Go 1.18将原生支持fuzz test | Gopher Daily (2021.09.21) ʕ◔ϖ◔ʔ

    每日一谚:Clear is better than clever. Go技术生态 Go 1.18合并了对Fuzz测试原生支持的代码 - https://github.com/golang/go/com ...

  4. Go语言云原生与微服务(二)微服务概述

    Hello,我是普通Gopher,00后男孩,极致的共享主义者,想要成为一个终身学习者.专注于做最通俗易懂的计算机基础知识类公众号.每天推送Golang技术干货,内容起于K8S而不止于K8S,涉及Do ...

  5. 如何用Python一门语言通吃高性能并发、GPU计算和深度学习

    [CTO讲堂]如何用Python一门语言通吃高性能并发.GPU计算和深度学习 发表于2016-01-04 15:11| 4374次阅读| 来源CSDN| 4 条评论| 作者蒲婧 CTO俱乐部CTOCT ...

  6. 谷歌开发者大会焦点:大中华区新掌门亮相,Android 10原生支持5G,TF2.0大更新...

      新智元报道   编辑:鹏飞.大明.张佳 [新智元导读]为期两天的2019谷歌开发者大会刚刚落下帷幕,谷歌推出了最新的Android 10.TensorFlow 2.0.Flutter 1.9等产品 ...

  7. 如何使用 Go 语言搭建企业级高并发服务器?

    每到节假日和过年,需要外出通行的人几乎都会遇到一个问题:抢火车票!当全国上亿人都在固定的时间段抢票,服务器动辄就要承受上百万级并发的情况时,你就会明白,一个支持高并发的服务器架构有多重要! 在后端程序 ...

  8. ie内核浏览器_[正式版下载] 微软全新 Chrome 内核 Edge 浏览器!原生支持 Chrome 插件扩展...

    尽管微软的 Office 和 Windows 10 势头不错,但像 WP 手机.XBox 等方面似乎并未获得预期的成功.而先前为了替代老旧的 IE 浏览器,微软倾力开发的 Edge 也未见起色. 不过 ...

  9. 原来浏览器原生支持JS Base64编码解码

    原来浏览器原生支持JS Base64编码解码 转载来源:https://www.zhangxinxu.com/wordpress/2018/08/js-base64-atob-btoa-encode- ...

最新文章

  1. VMware安装CentOS6.8详细教程
  2. Python基础06-数据类型:元组tuple
  3. java实现模拟考试系统,基于jsp的驾照模拟考试系统a-JavaEE实现驾照模拟考试系统a - java项目源码...
  4. 学习需要总结。。。。
  5. USACO Training Section 1.2 [USACO1.2]方块转换 Transformations
  6. 2018.12.08 codeforces 946D. Timetable(背包)
  7. 图解 深入浅出 JavaWeb:Servlet 再说几句
  8. Node.js 异步编程之 Callback介绍
  9. 读《企业应用架框模式》
  10. Struts2框架学习之一:Hello World程序
  11. android 模拟器 安装,夜神安卓模拟器安装环境
  12. 网易网盘关停!云端2T的“资源包、小电影”谁来守护?
  13. Live2D 博客页面添加板娘
  14. java effective
  15. 理解IaaS、SaaS、paas的含义及区别
  16. 全面提升转化率和客单价的方法和技巧
  17. 计算机等级考试四级 网络工程师 之 操作系统原理1 适合懒人备考哈哈哈
  18. quartusII 9.1 USB blaster驱动安装
  19. css样式,中间文字,两边横线
  20. Eclipse插件配置

热门文章

  1. pandas库中unique函数方法
  2. python3 pip ipython 安装
  3. VMware如何彻底删除干净?
  4. 【破事水】FLAME游戏背后的算法
  5. python游戏编程入门免费_python游戏编程入门 python游戏编程入门课
  6. cf服务器不显示名字,cf服务器冠名之战 怎么给服务器取名字
  7. 通讯:春运里的“诗意”航班
  8. 西电A测|基于Arduino uno的温度检测控制仿真系统
  9. 学文科的优势_学文科的好处有哪些?最后一个优点,理科生为之点赞
  10. Android手机怎么会越用越卡?