【go】如何证明 go map 不是并发安全的

【go】如何证明  go map  不是并发安全的

多个goroutine 同时访问,并没有任何问题,多次测试,都没有报错

回答

并发不安全和程序报错是两回事。

并发不安全指的是多个并发同时访问一个变量的时候,如果都有修改,是没法确定哪个修改最终生效的。比如A、B两个并发,同时对变量i做加1操作。假设i的初始值是0,那么最终结果可能是1,也可能是2,这就叫并发不安全。

并发不安全基本上不会导致程序报错,只是执行的结果会和期望的不一样,不可控。

试试下面这段代码:

package main

import "fmt"

func main() {

c := make(map[string]int)

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

go func() {

for j := 0; j < 1000000; j++ {

c[fmt.Sprintf("%d", j)] = j

}

}()

}

}

这段代码就很容易崩溃了。

为什么你的代码没有崩溃呢?
你虽然开了100个goroutine,跑了100次,但你始终是访问了同样的一个key-value:ceshi->1。结果就是map内部的数据结构基本上不会有变化。还有,100次触发这个bug的机率还不是足够大。

真实环境中这么用,一定会崩溃,只是你不知道什么时间会崩溃。写测试也一般都会通过。所以,不要心存侥幸。

golang中的并发安全 指的是 同一个变量在多个goroutine中访问时需要保证其安全性。
题主提供的代码正确运行不代表就不存在并发安全问题。

在golang官方文档中明确指出并发安全问题需要锁 或者 使用队列

Advice
Programs that modify data being simultaneously accessed by multiple goroutines must serialize such access.

To serialize access, protect the data with channel operations or other synchronization primitives such as those in the sync and sync/atomic packages.

If you must read the rest of this document to understand the behavior of your program, you are being too clever. Don't be clever.

这里有java的例子
http://www.cnblogs.com/alexlo... java 非并发安全的一个例子

以上是 【go】如何证明 go map 不是并发安全的 的全部内容, 来源链接: utcz.com/a/100294.html

回到顶部