首次提交:初始化项目代码
This commit is contained in:
@@ -0,0 +1,81 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"sync/atomic"
|
||||
)
|
||||
|
||||
const (
|
||||
White, Grey, Black = 0, 1, 2
|
||||
)
|
||||
|
||||
type SimObject struct {
|
||||
ID string
|
||||
Color int32
|
||||
Ref *SimObject
|
||||
}
|
||||
|
||||
func (o *SimObject) SetColor(c int32) { atomic.StoreInt32(&o.Color, c) }
|
||||
func (o *SimObject) GetColor() int32 { return atomic.LoadInt32(&o.Color) }
|
||||
|
||||
// 插入屏障:黑色→白色时标灰新对象(概念模拟)
|
||||
func InsertionBarrier(parent, child *SimObject) bool {
|
||||
if parent.GetColor() == Black && child.GetColor() == White {
|
||||
child.SetColor(Grey)
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// 删除屏障:无条件标灰旧引用(概念模拟)
|
||||
func DeletionBarrier(oldRef *SimObject) bool {
|
||||
if oldRef != nil && oldRef.GetColor() != Black {
|
||||
oldRef.SetColor(Grey)
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func colorName(c int32) string {
|
||||
switch c {
|
||||
case White:
|
||||
return "白"
|
||||
case Grey:
|
||||
return "灰"
|
||||
case Black:
|
||||
return "黑"
|
||||
}
|
||||
return "未知"
|
||||
}
|
||||
|
||||
func main() {
|
||||
fmt.Println("=== 场景1:无屏障 → 漏标风险 ===")
|
||||
A := &SimObject{ID: "A", Color: Black}
|
||||
B := &SimObject{ID: "B", Color: White}
|
||||
A.Ref = B
|
||||
C := &SimObject{ID: "C", Color: White}
|
||||
A.Ref = C
|
||||
fmt.Printf("⚠️ B 状态: %s (孤立白色对象,应被回收)\n", colorName(B.GetColor()))
|
||||
|
||||
fmt.Println("\n=== 场景2:插入屏障保护 ===")
|
||||
A.SetColor(Black)
|
||||
B.SetColor(White)
|
||||
A.Ref = B
|
||||
D := &SimObject{ID: "D", Color: White}
|
||||
if InsertionBarrier(A, D) {
|
||||
fmt.Printf("🛡️ [插入] A(黑)→D(白) → D 标灰\n")
|
||||
}
|
||||
A.Ref = D
|
||||
fmt.Printf("✅ D 状态: %s (被屏障保护)\n", colorName(D.GetColor()))
|
||||
|
||||
fmt.Println("\n=== 场景3:删除屏障保护 ===")
|
||||
E := &SimObject{ID: "E", Color: Black}
|
||||
F := &SimObject{ID: "F", Color: White}
|
||||
E.Ref = F
|
||||
G := &SimObject{ID: "G", Color: White}
|
||||
if DeletionBarrier(E.Ref) {
|
||||
fmt.Printf("🛡️ [删除] 旧引用 F(白) → F 标灰\n")
|
||||
}
|
||||
E.Ref = G
|
||||
fmt.Printf("✅ F 状态: %s (被屏障重新标灰)\n", colorName(F.GetColor()))
|
||||
}
|
||||
Reference in New Issue
Block a user