在Go1.5中,此代码会导致GC后的混乱吗?

时间:2016-06-06 11:07:54

标签: go garbage-collection goroutine

package main

import "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的地址会被回收并引起恐慌吗?

2 个答案:

答案 0 :(得分:1)

没有。首先,x具有全局范围。因此,只有分配了具有新地址的新值,GC才会发生。

现在,当分配新值时,可能会发生两件事:

  1. Goroutine将y分配给x。它被分配给y。然后没有GC会发生。
  2. 在第一步发生之前,它将使用新地址获取新值。
  3. 我不知道你要做什么。但即使goroutine同时运行也没有恐慌。 X总是有一个值。

    因为你问过赋值是否是原子的:没有正常的赋值是原子的。

答案 1 :(得分:1)

"并未真正分配" - 什么,没有这样的东西。

您的代码具有竞争条件go run -race,它写入" x",从" x"并且同时增长" x"'切片。

" y:= x"一般来说它不是原子的,它取决于值,但对于slice / interface {} / map / struct来说肯定不是原子的。有原子基元的sync.atomic包。