美文网首页
Go append并发问题

Go append并发问题

作者: ztime1 | 来源:发表于2017-03-06 11:39 被阅读0次

Golang append并发问题


package main

import (

"fmt"

"sync"

)

func main() {

var wg sync.WaitGroup

s := make([]int, 0, 1000)

for i := 0; i < 1000; i++ {

v := i

wg.Add(1)

go func() {

s = append(s, v)

wg.Done()

}()

}

wg.Wait()

fmt.Printf("%v\n", len(s))

}

结果

第一次:928

第二次:945

第三次:986

……

多运行几次你就会发现,slice长度并不是1000,而是不停的在变,为什么呢?

因为append并不是并发安全的。

我们举一个简单例子,比如,当A和B两个协程运行append的时候同时发现s[1]这个位置是空的,他们就都会把自己的值放在这个位置,这样他们两个的值就会覆盖,造成数据丢失。

那该怎么写?最简单的方式就是用锁,贴一个例子。

package main

import (

"fmt"

"sync"

)

func main() {

var (

wg    sync.WaitGroup

mutex sync.Mutex

)

s := make([]int, 0, 1000)

for i := 0; i < 1000; i++ {

v := i

wg.Add(1)

go func() {

mutex.Lock()

s = append(s, v)

mutex.Unlock()

wg.Done()

}()

}

wg.Wait()

fmt.Printf("%v\n", len(s))

}

运行一下这个例子就会发现,s的长度总是1000。

相关文章

  • Go append并发问题

    Golang append并发问题

  • 【Golang】make和new区别,append

    根据GO夜读学习go源码 源码: Demo Output Append Demo 在往slice里append元素...

  • 第03天(复合类型)_04

    18_切片和底层数组关系.go 19_append函数的使用.go 20_append扩容特点.go 21_cop...

  • 【线程的另一种形式】

    今天研究的问题: 1. Go并发忧于Java并发? 2. Go语言的并发是多线程实现的么? 3. Java并...

  • go语言中控制并发数量的方法

    因为go语言层面支持并发,所以面试中经常会问到并发的问题,比如说控制go并发数量的方式有哪些? 下面是我个人整理的...

  • Go语言并发安全

    go语言最重要的特点就是原生支持并发————goroutine。而用到并发,就不得不考虑数据安全的问题。Go语言里...

  • Go append slice

  • go slice append

    go slice append 切片的底层是一个数组,如果截取切片的一部分赋给另一个切片,那这两个切片的数据其实指...

  • Go语言并发

    Go语言并发 Go语言级别支持协程,叫做goroutine Go 语言从语言层面支持并发和并行的开发操作 Go并发...

  • Go基础语法(九)

    Go语言并发 Go 是并发式语言,而不是并行式语言。 并发是指立即处理多个任务的能力。 Go 编程语言原生支持并发...

网友评论

      本文标题:Go append并发问题

      本文链接:https://www.haomeiwen.com/subject/kigygttx.html