Go 互斥锁(sync.Mutex)和 读写锁(sync.RWMutex)

互斥锁(sync.Mutex)和 读写锁(sync.RWMutex)

互斥锁

互斥锁是一种常用的控制共享资源访问的方法,它能够保证同时只有一个 goroutine 可以访问到共享资源

demo:开启 3 个 goroutine 进行累加,输出最终结果和耗时

package main
import (
	"fmt"
	"sync"
	"time"
)

var (
	count  int
	status int
	//互斥锁
	countGuard sync.Mutex
)

func accumulator() {

	for i := 0; i < 10000000; i++ {
		countGuard.Lock()
		count += 1
		countGuard.Unlock()
	}
	status += 1
}

func main() {
	var num int = 3
	//统计用时
	startTime := time.Now().UnixNano() / 1e6

	for i := 0; i < num; i++ {
		go accumulator()
	}

	//不让main中的 goroutine 停止
	for {
		if status == num {
			endTime := time.Now().UnixNano() / 1e6
			useTime := endTime - startTime
			fmt.Printf("最终累加结果:%d\n耗时:%d ms\n", count, useTime)
			break
		}
	}
}

运行结果:
最终累加结果:30000000
耗时:2197 ms

读写锁

在读多写少的环境中,可以优先使用读写互斥锁(sync.RWMutex),它比互斥锁更加高效。sync 包中的 RWMutex 提供了读写互斥锁的封装

package main
import (
	"fmt"
	"sync"
	"time"
)

var (
	count  int
	status int
	//互斥锁
	countGuard sync.RWMutex
)

func accumulator() {

	for i := 0; i < 10000000; i++ {
		countGuard.Lock()
		count += 1
		countGuard.Unlock()
	}
	status += 1
}

func main() {
	var num int = 3
	//统计用时
	startTime := time.Now().UnixNano() / 1e6

	for i := 0; i < num; i++ {
		go accumulator()
	}

	//不让main中的 goroutine 停止
	for {
		if status == num {
			endTime := time.Now().UnixNano() / 1e6
			useTime := endTime - startTime
			fmt.Printf("最终累加结果:%d\n耗时:%d ms\n", count, useTime)
			break
		}
	}
}

  

end ~

猜你喜欢

转载自www.cnblogs.com/kaichenkai/p/11108303.html
今日推荐