[Go实战]互斥锁的两种实现

27 阅读1分钟
package main

import (
	"fmt"
	"sync"
)

func mutexLock(){
	fmt.Println("mutexLock start")
	var num int
	var mtx sync.Mutex
	var wg sync.WaitGroup
	add:= func() {
		mtx.Lock()

		defer mtx.Unlock()
		defer wg.Done()

		num += 1
	}

	for i := 0; i < 100; i++ {
		wg.Add(1)
		go add()
	}

	wg.Wait()

	fmt.Println("num:", num)
}

func chanLock(){
	fmt.Println("chanLock start")
	var num int
	add := func(h chan int, wg *sync.WaitGroup) {
		defer wg.Done()

		h <- 1
		num += 1
		<-h
	}
	ch := make(chan int, 1)
	wg := &sync.WaitGroup{}

	for i := 0; i < 100; i++ {
		wg.Add(1)
		go add(ch, wg)
	}

	wg.Wait()

	fmt.Println("num:", num)
}

func main() {
	mutexLock()
	chanLock()
}