golang的协程同步

54 阅读1分钟

shared variable

use mutex

var mutex = sync.Mutex{}
mutex.lock()
do something
mutex.UnLock()

ony do once

var once = sync.Once{}
go once.Do(function_name)

waitGroup

var wg = sync.WaitGroup{}
func doSomething() {
wg.Add(1)
//do something
wg.Done()
}
func main() {
go doSomething()
go doSomething()
wg.Wait()
}

send message

var mutex = &sync.Mutex{}
var cond = sync.NewCond(mutex)
func doSomething() {
	cond.L.Lock()
	for true {
		cond.Wait()
		// do something
	}
	cond.L.Unlock()
}
func main() {
	for i := 0; i < 100; i++ {
		go incrNum()
	}
	// random goroutine
	cond.Signal()
	// all goroutine
	cond.Broadcast()
}

sync.Map

sync.Pool