本文来瞅瞅常见并发模式的用法. 在大多数语言中,为了解决线程同步问题都会用到加锁的方法;Go也不例外,但是Go也提供了另外的方式来解决同步通信问题:将共享的值通过通道来进行传输.实践中通过goroutine和channel的配合使用实现了这一特性.
- 通过互斥锁实现同步通信
package main
import (
"fmt"
"sync"
)
func main() {
var mux sync.Mutex
// 先锁一次
mux.Lock()
go func() {
fmt.Println("Hello my friend!")
// 在后台线程中解锁
mux.Unlock()
}()
// 尝试再锁一次,由于锁已被占用会阻塞直到解锁
mux.Lock()
}
- 通过sync.WaitGroup实现多个线程的同步
package main
import (
"fmt"
"sync"
)
func main() {
// 创建waitgroup
var wg sync.WaitGroup
// 开启10个打印线程
for i:=0; i<10; i+=1 {
// 每开启一个线程前,等待事件计数加1
wg.Add(1)
idx := i
go func(index int) {
fmt.Printf("[%d]Hello my friend!\n", index)
// 向通道写数据
wg.Done()
}(idx)
}
// Wait方法,等待所有事件完成
wg.Wait()
}
- 通过channel实现同步通信
package main
import (
"fmt"
)
func main() {
// 创建一个无缓存通道
done := make(chan int)
go func() {
fmt.Println("Hello my friend!")
// 向通道写数据
done <- 1
}()
// 堵塞等待接收数据
<-done
}