From 237c06768b2adda423f44b046675167f58809069 Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 10 Jul 2024 00:18:40 +0800 Subject: [PATCH] =?UTF-8?q?sync.once=20=E7=A1=AE=E4=BF=9D=E6=89=A7?= =?UTF-8?q?=E8=A1=8C=E4=B8=80=E6=AC=A1=20sync.map=E5=B9=B6=E5=8F=91?= =?UTF-8?q?=E5=AE=89=E5=85=A8=E7=89=88map=20finished?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sync/sync.map.go | 32 ++++++++++++++++++++++++++++++ sync/sync.map_example.go | 26 +++++++++++++++++++++++++ sync/sync.once.go | 42 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 100 insertions(+) create mode 100644 sync/sync.map.go create mode 100644 sync/sync.map_example.go create mode 100644 sync/sync.once.go diff --git a/sync/sync.map.go b/sync/sync.map.go new file mode 100644 index 0000000..e9d5470 --- /dev/null +++ b/sync/sync.map.go @@ -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() +} diff --git a/sync/sync.map_example.go b/sync/sync.map_example.go new file mode 100644 index 0000000..85c51d2 --- /dev/null +++ b/sync/sync.map_example.go @@ -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() +} diff --git a/sync/sync.once.go b/sync/sync.once.go new file mode 100644 index 0000000..a4f7da7 --- /dev/null +++ b/sync/sync.once.go @@ -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) + } + +}