Golang中方法的goroutine在对象无引用时会被自动终止吗

Golang中方法的goroutine在对象无引用时会被自动终止吗 大家好, 我是Go语言的新手。 有个问题想请教:如果一个对象的方法在另一个goroutine中运行,然后该对象失去了所有引用(指向该对象的指针)。当垃圾回收器运行时,这个goroutine会被终止吗?

谢谢。

2 回复

方法如何失去对其接收者的引用?

更多关于Golang中方法的goroutine在对象无引用时会被自动终止吗的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


不会。在Go语言中,goroutine的生命周期独立于创建它的对象。即使对象失去了所有引用并成为垃圾回收的候选对象,只要goroutine仍在运行,它就不会被自动终止。垃圾回收器仅回收不再使用的内存,而不会干预goroutine的执行。

详细解释:

  • goroutine的独立性:goroutine由Go运行时调度,其执行不依赖于创建它的对象。只要goroutine在运行(例如,通过循环、通道操作或系统调用保持活动),它就会继续执行,即使原始对象已不可达。
  • 垃圾回收器的作用:垃圾回收器负责回收未被引用的内存,但不会主动停止goroutine。如果goroutine内部引用了对象,该对象会保持活跃状态,直到goroutine结束或释放引用。

示例代码:

以下示例演示了对象失去引用后,其方法中的goroutine仍继续运行:

package main

import (
	"fmt"
	"time"
)

type Worker struct {
	name string
}

func (w *Worker) start() {
	go func() {
		for i := 0; i < 5; i++ {
			fmt.Printf("Worker %s: step %d\n", w.name, i)
			time.Sleep(1 * time.Second)
		}
		fmt.Printf("Worker %s: finished\n", w.name)
	}()
}

func main() {
	worker := &Worker{name: "GoroutineWorker"}
	worker.start() // 启动goroutine

	// 立即让worker失去引用
	worker = nil

	// 等待足够时间以观察goroutine输出
	time.Sleep(6 * time.Second)
	fmt.Println("Main function exits")
}

输出示例

Worker GoroutineWorker: step 0
Worker GoroutineWorker: step 1
Worker GoroutineWorker: step 2
Worker GoroutineWorker: step 3
Worker GoroutineWorker: step 4
Worker GoroutineWorker: finished
Main function exits

关键点:

  • 即使workermain函数中被设置为nil,goroutine仍完成全部5次迭代。
  • 在goroutine中,w.name通过闭包捕获了对象的引用,因此在goroutine执行期间,对象不会被回收。如果goroutine不引用对象,对象可能更早被回收,但goroutine本身不受影响。

总之,goroutine的生命周期由自身控制,垃圾回收不会终止它。确保goroutine正确退出(例如通过上下文或通道)是避免资源泄漏的最佳实践。

回到顶部