sync.once 确保执行一次 sync.map并发安全版map finished
parent
3c356f488a
commit
237c06768b
|
@ -0,0 +1,32 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strconv"
|
||||||
|
"sync"
|
||||||
|
)
|
||||||
|
|
||||||
|
// GO内置的map不是并发安全的
|
||||||
|
var m = make(map[string]int)
|
||||||
|
|
||||||
|
func get(key string) int {
|
||||||
|
return m[key]
|
||||||
|
}
|
||||||
|
|
||||||
|
func set(key string, value int) {
|
||||||
|
m[key] = value
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
wg := sync.WaitGroup{}
|
||||||
|
for i := 0; i < 10; i++ {
|
||||||
|
wg.Add(1)
|
||||||
|
go func(n int) {
|
||||||
|
key := strconv.Itoa(n)
|
||||||
|
set(key, n)
|
||||||
|
fmt.Printf("k=:%v,v:=%v\n", key, get(key))
|
||||||
|
wg.Done()
|
||||||
|
}(i)
|
||||||
|
}
|
||||||
|
wg.Wait()
|
||||||
|
}
|
|
@ -0,0 +1,26 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strconv"
|
||||||
|
"sync"
|
||||||
|
)
|
||||||
|
|
||||||
|
// 并发安全版map
|
||||||
|
//无需初始化
|
||||||
|
var sm sync.Map
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
w := sync.WaitGroup{}
|
||||||
|
for i := 0; i < 10; i++ {
|
||||||
|
w.Add(1)
|
||||||
|
go func(n int) {
|
||||||
|
defer w.Done()
|
||||||
|
key := strconv.Itoa(n)
|
||||||
|
sm.Store(key, n) //必须使用sync.Map内置的store方法去设置键值对
|
||||||
|
value, _ := sm.Load(key) //必须使用sync.Map内置的load方法取值
|
||||||
|
fmt.Printf("k:%v,v:%v\n", key, value)
|
||||||
|
}(i)
|
||||||
|
}
|
||||||
|
w.Wait()
|
||||||
|
}
|
|
@ -0,0 +1,42 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import "sync"
|
||||||
|
|
||||||
|
//某些操作只需要在高并发场景中做一次,例如加载配置文件
|
||||||
|
//这种场景下用到sync.once
|
||||||
|
|
||||||
|
var waitGroup sync.WaitGroup
|
||||||
|
var once sync.Once
|
||||||
|
|
||||||
|
func send(ch1 chan<- int) {
|
||||||
|
defer waitGroup.Done()
|
||||||
|
for i := 0; i < 100; i++ {
|
||||||
|
ch1 <- i
|
||||||
|
}
|
||||||
|
close(ch1)
|
||||||
|
}
|
||||||
|
func getV(ch1 <-chan int, ch2 chan<- int) {
|
||||||
|
defer waitGroup.Done()
|
||||||
|
for {
|
||||||
|
x, ok := <-ch1
|
||||||
|
if !ok {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
ch2 <- x * x
|
||||||
|
}
|
||||||
|
once.Do(func() { close(ch2) })
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
a := make(chan int, 100)
|
||||||
|
b := make(chan int, 100)
|
||||||
|
waitGroup.Add(3)
|
||||||
|
go send(a)
|
||||||
|
go getV(a, b)
|
||||||
|
go getV(a, b)
|
||||||
|
waitGroup.Wait()
|
||||||
|
for ret := range b {
|
||||||
|
println(ret)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue