В https://golang.org/ref/mem#tmp_10, эта программа не является безопасной, как показано ниже, нет гарантии, что вы напечатаете самую новую версию сообщения MSG
type T struct {
msg string
}
var g *T
func setup() {
t := new(T)
t.msg = "hello, world"
g = t
}
func main() {
go setup()
for g == nil {
}
print(g.msg)
}
В JAVA, нормально для volatile g, мы должны использовать rwmutexпродолжать печатать новейшие сообщения в golang, как показано ниже?
type T struct {
msg string
rwlock sync.RWMutex
}
var g = &T{}
func setup() {
g.rwlock.Lock()
defer g.rwlock.Unlock()
g.msg = "hello, world"
}
func main() {
go setup()
printMsg()
}
func printMsg() {
g.rwlock.RLock()
defer g.rwlock.RUnlock()
print(g.msg)
}