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)
}
                


















