golang内存模型-3 once解决HappensBefore

简介: golang内存模型-3 once解决HappensBefore

你要尽全力保护你的梦想。那些嘲笑你梦想的人,因为他们必定会失败,他们想把你变成和他们一样的人。---《当幸福来敲门》


1. 前言



继上篇文章我们介绍了锁在解决HappensBefore的重要作用,接下来这片文章我们来聊聊once是怎么满足HappensBefore的。


2. 例子



还是上篇文章销毁goroutine的例子


package main
var a string
func hello() {
 go func() { a = "hello" }()
 print(a)
}
func main() {
 hello()
}


我们说这个例子有问题,上篇文章说了,就是结果不确定,那么我们如何通过once来解决呢?


3. 解决



sync包的Once为多个goroutine提供了安全的初始化机制。能在多个线程中执行once.Do(f),但只有一个f()会执行,其他调用会一直阻塞直到f()返回。通过执行先行发生(指f()返回)于其他的返回。例如:


package main
import (
 "sync"
 "time"
)
var a string
var once sync.Once
func setup() {
 a = "hello"
}
func hello() {
 once.Do(setup)
 print(a)
}
func main() {
 go hello()
 go hello()
 time.Sleep(100*time.Second)
}


我们看到结果是打印两次hellohello,setup只在第一次调用hello()的时候执行一次。


hellohello


4. 小结



once的使用比较常见,更多的使用场景是对象只初始化一次的sense中。希望通过golang内存模型这三篇文章能够帮助到大家在写代码的时候如何应对HappensBefore。


5. 关注公众号



 微信公众号:堆栈future

相关文章
|
存储 编译器 Go
Golang底层原理剖析之内存对齐
Golang底层原理剖析之内存对齐
195 0
|
存储 算法 编译器
Golang 语言的内存管理
Golang 语言的内存管理
136 0
|
安全 编译器 Go
Golang 语言的内存模型
Golang 语言的内存模型
161 0
|
Go
Golang语言标准库 sync 包的 Once 怎么使用?
Golang语言标准库 sync 包的 Once 怎么使用?
212 0
|
5月前
|
安全 Go 开发者
“不要通过共享内存来通信”——深入理解Golang并发模型与CSP理论
Golang 采用 CSP 理念,主张“通过通信共享内存”,以消息传递替代共享内存,避免数据竞争。其核心为 Goroutine 与 Channel:轻量协程并发执行,通道安全传递数据,将并发复杂性转为通信编排,提升程序清晰度与可维护性。
384 0
|
存储 缓存 Java
golang 内存管理
golang 内存管理
272 0
|
NoSQL Java 测试技术
Golang内存分析工具gctrace和pprof实战
文章详细介绍了Golang的两个内存分析工具gctrace和pprof的使用方法,通过实例分析展示了如何通过gctrace跟踪GC的不同阶段耗时与内存量对比,以及如何使用pprof进行内存分析和调优。
620 0
Golang内存分析工具gctrace和pprof实战
|
Kubernetes 网络协议 测试技术
记一次golang内存泄露
记一次golang内存泄露
183 4
|
Prometheus Cloud Native Java
解决golang 的内存碎片问题
解决golang 的内存碎片问题
278 3
|
监控 Java 测试技术
No.7 一篇文章讲清楚golang内存泄漏
No.7 一篇文章讲清楚golang内存泄漏
1014 1
No.7 一篇文章讲清楚golang内存泄漏

推荐镜像

更多