Go 我们只能在没有volatile的情况下使用RWMutex?

Go 我们只能在没有volatile的情况下使用RWMutex?,go,Go,在中,此程序不安全,如下所示,无法保证打印最新消息 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在

在中,此程序不安全,如下所示,无法保证打印最新消息

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)
}

我认为如果你使用频道会更好

type T struct {
    msg string
    doneC chan struct{}
}

func NewT() *T {
    return &T{
        doneC: make(chan struct{}, 1),
    }
}

func (t *T) setup() {
    t.msg = "hello, world"
    t.doneC <- struct{}{}
}

func main() {
    t := NewT()
    go t.setup()
    <- t.doneC // or use select to set a timeout
    fmt.Println(t.msg)
}
T型结构{
味精串
doneC chan结构{}
}
func NewT()*T{
返回&T{
doneC:make(chan结构{},1),
}
}
函数(t*t)设置(){
t、 msg=“你好,世界”

t、 doneC以下是一些其他选项

忙等待。此程序在当前版本的Go中完成,但规范不保证

频道

package main

import (
    "runtime"
    "sync/atomic"
    "unsafe"
)

type T struct {
    msg string
}

var g unsafe.Pointer

func setup() {
    t := new(T)
    t.msg = "hello, world"
    atomic.StorePointer(&g, unsafe.Pointer(t))
}

func main() {
    go setup()
    var t *T
    for {
        runtime.Gosched()

        t = (*T)(atomic.LoadPointer(&g))
        if t != nil {
            break
        }
    }
    print(t.msg)
}
func setup(ch chan struct{}) {
    t := new(T)
    t.msg = "hello, world"
    g = t
    close(ch) // signal that the value is set
}

func main() {
    var ch = make(chan struct{})
    go setup(ch)
    <-ch // wait for the value to be set.
    print(g.msg)
}
var g *T

func setup(wg *sync.WaitGroup) {
    t := new(T)
    t.msg = "hello, world"
    g = t
    wg.Done()
}

func main() {
    var wg sync.WaitGroup
    wg.Add(1)
    go setup(&wg)
    wg.Wait()
    print(g.msg)
}