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

来源:10-2 go语言的调度器

小学生6年级

2019-10-04

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


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

写回答

1回答

ccmouse

2019-10-26

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

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

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

3
2
ccmouse
回复
198703
性能上是一样的。不过推荐用channel,用通信来共享数据,而不是用共享数据来通信。
2020-04-05
共2条回复

Google资深工程师深度讲解Go语言 由浅入深掌握Go语言

语法+分布式爬虫实战 为转型工程师量身打造

5995 学习 · 1909 问题

查看课程