Files
bulma/write_barrier_finalizer.go

37 lines
905 B
Go

package main
import (
"fmt"
"runtime"
"sync/atomic"
"time"
)
type TestData struct{ Value int }
func main() {
var gcTriggered int32
blackObj := &struct{ ref *TestData }{}
done := make(chan struct{})
go func() {
time.Sleep(5 * time.Millisecond)
whiteObj := &TestData{Value: 42}
runtime.SetFinalizer(whiteObj, func(o *TestData) {
if atomic.LoadInt32(&gcTriggered) == 1 {
fmt.Printf("❌ 验证失败:whiteObj 被回收!值=%d\n", o.Value)
}
})
blackObj.ref = whiteObj // 触发写屏障(由运行时自动处理)
fmt.Println("✅ 业务线程:黑色对象引用新白色对象")
close(done)
}()
atomic.StoreInt32(&gcTriggered, 1)
runtime.GC() // 触发含并发标记的 GC
<-done
fmt.Println("✅ 验证通过:新对象存活(写屏障将其标灰纳入扫描)")
fmt.Println("💡 原理:运行时写屏障拦截赋值,将 whiteObj 标灰")
}