package mainimport "time"var x = []string{}func main() { go func() { for { y := x y = append(y, "aa") } }() go func() { for { x = []string{"123"} } }() for { time.Sleep(1) }}猜想当x(比如123的地址)并没有真正分配给y,而x被分配给了一个新的地址,比如124。而这一次gc发生了,123的地址会不会被回收并引起panic?
2 回答
守候你守候我
TA贡献1802条经验 获得超10个赞
不,首先, x 具有全局范围。所以 GC 不会发生,直到为它分配一个具有新地址的新值。
现在,当分配一个新值时,可能会发生两件事:
将 y 分配给 x 的 Goroutine 发生了。它被分配给 y。然后不会发生 GC。
在第一步发生之前,它将通过新地址获得新值。
我不知道你想做什么。但是即使 goroutine 同时运行也没有恐慌。X 总是有一个值。
既然您问分配是否是原子的:没有正常的分配是原子的。
米脂
TA贡献1836条经验 获得超3个赞
“没有真正分配” - 什么,go中没有这样的事情。
您的代码有一个竞争条件go run -race
,它写入“x”,从“x”读取并同时增长“x”的切片。
"y := x" 通常不是原子的,它取决于值,但对于 slice/interface{}/map/struct 肯定不是原子的。有用于原子原语的 sync.atomic 包。
- 2 回答
- 0 关注
- 134 浏览
添加回答
举报
0/150
提交
取消