前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >golang学习笔记——sync库

golang学习笔记——sync库

作者头像
码缘
发布2021-03-09 16:52:04
3360
发布2021-03-09 16:52:04
举报
文章被收录于专栏:PHP修行之路PHP修行之路

sync.WaitGroup 优雅的同步执行协程

package main

import (

"fmt"

"math/rand"

"sync"

"time"

)

func f1(i int) {

defer wg.Done()

rand.Seed(time.Now().UnixNano())

time.Sleep(time.Millisecond * time.Duration(rand.Intn(3)))

fmt.Println(i)

}

var wg sync.WaitGroup

func main() {

for i := 0; i < 10; i++ {

wg.Add(1)

go f1(i)

}

wg.Wait()

}

sync.Mutex 互斥锁

package main

import (

"fmt"

"sync"

)

var x = 0

var wg sync.WaitGroup

var mu sync.Mutex

func add() {

defer wg.Done()

for i := 0; i < 500000; i++ {

//公共资源加锁

mu.Lock()

x = x + 1

//解锁

mu.Unlock()

}

}

func main() {

wg.Add(2)

go add()

go add()

wg.Wait()

fmt.Println(x)

}

sync.RWMutex 读写锁

  • 基本遵循两大原则:1、获取到读锁之后可以随便读,多个goroutine同时读,但是任何goroutine都不能写;2、写的时候,啥也不能干。只能获取到写锁的那个goroutine可以写,其他的goroutine既不能读也不能写。

package main

import (

"fmt"

"sync"

"time"

)

var (

x int = 1

wg sync.WaitGroup

rw sync.RWMutex

)

func write() {

defer wg.Done()

rw.Lock()

x = x + 1

rw.Unlock()

time.Sleep(time.Millisecond)

}

func read() {

defer wg.Done()

rw.RLock()

fmt.Println(x)

rw.RUnlock()

}

func main() {

for i := 1; i < 10; i++ {

wg.Add(1)

go write()

}

time.Sleep(time.Second)

for m := 0; m < 100; m++ {

wg.Add(1)

go read()

}

wg.Wait()

}

sync.Once 保证只执行一次

package singleton

import (

"sync"

)

type singleton struct {}

var instance *singleton

var once sync.Once

func GetInstance() *singleton {

once.Do(func() {

instance = &singleton{}

})

return instance

}

sync.Map 并发安全的map数据结构(Go中内置的map是并发不安全的)

package main

import (

"fmt"

"strconv"

"sync"

)

func main() {

var m = sync.Map{}

var wg sync.WaitGroup

for i := 0; i < 40; i++ {

wg.Add(1)

go func(i int) {

defer wg.Done()

str := strconv.Itoa(i)

m.Store(i, str)

v, _ := m.Load(i)

fmt.Printf("key:%v,value:%v \n", i, v)

}(i)

}

wg.Wait()

}

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-03-05 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档