想请教下老师一个关于 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来实现。
322020-04-05
相似问题