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

相关文章
|
4月前
|
存储 编译器 Go
Golang底层原理剖析之内存对齐
Golang底层原理剖析之内存对齐
47 0
|
11月前
|
存储 算法 编译器
Golang 语言的内存管理
Golang 语言的内存管理
43 0
|
11月前
|
安全 编译器 Go
Golang 语言的内存模型
Golang 语言的内存模型
51 0
|
11月前
|
Go
Golang语言标准库 sync 包的 Once 怎么使用?
Golang语言标准库 sync 包的 Once 怎么使用?
42 0
|
14天前
|
NoSQL Java 测试技术
Golang内存分析工具gctrace和pprof实战
文章详细介绍了Golang的两个内存分析工具gctrace和pprof的使用方法,通过实例分析展示了如何通过gctrace跟踪GC的不同阶段耗时与内存量对比,以及如何使用pprof进行内存分析和调优。
45 0
Golang内存分析工具gctrace和pprof实战
|
1月前
|
Prometheus Cloud Native Java
解决golang 的内存碎片问题
解决golang 的内存碎片问题
42 3
|
1月前
|
Kubernetes 网络协议 测试技术
记一次golang内存泄露
记一次golang内存泄露
38 4
|
10月前
|
存储 缓存 Java
golang 内存管理
golang 内存管理
|
4月前
|
存储 缓存 算法
Golang高性能内存缓存库BigCache设计与分析
【2月更文挑战第4天】分析Golang高性能内存缓存库BigCache设计
163 0
|
4月前
|
Java 编译器 Go
Golang底层原理剖析之内存逃逸
Golang底层原理剖析之内存逃逸
40 0