咱们先假设一个需求,建立一个数组,里面存放 0 - 99 的整数。数组
上代码:闭包
输出:app
然而并非咱们想要的结果,不少重复数值。函数
释义:3d
12行这个闭包函数对 i 的传递并不是深拷贝,而是传递了变量指针,也就意味着多个协程访问的时候操做的是同一块内存。指针
当某一个协程修改了i的值,致使多个协程append的时候i的值发生变化,简单的说就是一个更改,多个读取同时存在,不少个协程都读到某个数值,好比是14,多个协程执行后你们的结果都是同样,是15.协程
咱们升级下代码:blog
输出:内存
咱们能够看到第2行的输出94,若是没有多运行几回,少于100,也就是说发生了数据丢失,这是为什么?资源
这就是竞态,由于多个协程同时访问临界区,程序并非按照前后顺序去执行,多个协程抢占资源,这就致使一部分协程没有获得资源。
解决的办法不少,这里讲解下互斥锁和更换数据类型
办法1:换数据类型
切片不一样于数组,在每次append的时候咱们会伴随着内存copy以达到自动扩容目的,在A协程读出a的内存数据时,B协程完成了写入操做,此时A继续append并赋值就会致使,协程B的更新结果丢失。
假如咱们将切片换成数组就不存在这个问题:
稳定输出:
2:互斥锁
输出元素的次序没有规律,可是个数很稳定:
也就是说没有丢失数据