GO协程初识
package main
import (
"fmt"
"sync"
"time"
)
func read() {
defer wg.Done()
fmt.Println("read start")
time.Sleep(time.Second * 3)
fmt.Println("read end")
}
func listenMusci() {
defer wg.Done()
fmt.Println("listenMusci start")
time.Sleep(time.Second * 5)
fmt.Println("listenMusci end")
}
var wg sync.WaitGroup //声明一把锁,同步的一个等待锁,本质是一个计时器,所有的进程都可以共享
func main() {
start := time.Now().Unix()
wg.Add(2)
go read() //开启GO并发
go listenMusci() //开启GO并发
wg.Wait() //计数器为0继续执行
//time.Sleep(time.Second * 10) //将main主线程阻塞下
end := time.Now().Unix()
fmt.Println(end - start)
}
输出结果:
互斥锁
package main
import (
"fmt"
"sync"
"time"
)
/*
互斥锁!!!
互斥锁是一种常用的控制共享资源访问的方法,它能够保证同时只有
一个goroutine可以访问共享资源。Go语言中使用sync包的Mutex类型来实现互斥锁。
使用互斥锁能够保证同一时间有且只有一个goroutine进入临界区,
其他的goroutine则在等待锁;当互斥锁释放后,等待的goroutine才可以获取锁进入临界区,
多个goroutine同时等待一个锁时,唤醒的策略是随机的。
*/
var wg sync.WaitGroup //声明一把锁,同步的一个等待锁,本质是一个计时器,所有的进程都可以共享
var lock sync.Mutex
var x = 0
func add() {
defer wg.Done()
//加锁,互斥锁
lock.Lock()
x++
lock.Unlock()
println(x)
time.Sleep(time.Second * 10) //
}
func main() {
wg.Add(100)
for i := 0; i < 100; i++ {
go add()
}
wg.Wait() //计数器为0继续执行
fmt.Println(x)
}