请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

想请教下老师一个关于 volatile 的问题

比如说 JAVA 中的单例模式实现的时候, 双重锁的实现方式中必须要加上 volatile 才能保证一定是线程安全的。 那么 golang 中呢,并没有 volatile 关键字,没办法保证内存屏障的话该如何保证线程安全呢。


哦哦,后来想了想是不是 golang 这样子的编译型语言中, singleton = &test{} 这样子的时候,后面 new 的 test 的底部非原子性操作是不会发生重排序的,也就没有 JAVA 中的问题了。 毕竟那个问题应该是 JVM 的优化所带进来的,这里还是想像老师求证一下我的猜测。 (自己是个非科班的前端,之前只懂 JS,没接触过 C/C++,这方面薄弱了些)。

正在回答 回答被采纳积分+3

1回答

ccmouse 2019-10-26 15:53:16

你问的问题已经说明你理解的很透彻了:)go没有volatile关键字,不过go一样有需要保证线程安全的地方。

比如singleton=&test{},这句话如果多个goroutine同时调用,就会出问题,需要使用sync.Mutex或是sync/atomic包里的同步原语进行保护。

如果一个goroutine中的状态需要被另一个goroutine看到(这也就是volatile在Java中的作用),go语言建议用sync,sync/atomic或是使用channel来实现。

3 回复 有任何疑惑可以回复我~
  • 198703 #1
    sync,sync/atomic或channel  更推荐哪个呢? 是不是channel性能更好
    回复 有任何疑惑可以回复我~ 2020-04-04 22:22:44
  • ccmouse 回复 198703 #2
    性能上是一样的。不过推荐用channel,用通信来共享数据,而不是用共享数据来通信。
    回复 有任何疑惑可以回复我~ 2020-04-05 11:39:28
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信