Go语言协程并发---读写锁sync.RWMutex

package main

import (
	"fmt"
	"sync"
	"time"
)

/*
读写锁
多路只读
一路只写
读写互斥
*/

/*读写锁API介绍*/
func main101() {
	var rwm sync.RWMutex

	//锁定为写模式---一路只写
	rwm.Lock()
	//解锁写模式
	rwm.Unlock()

	//锁定为读模式---多路只读
	rwm.RLock()
	//释放读写锁
	rwm.RUnlock()
}


/*
数据库一写多度
·Read方法设定为多路只读
·Write方法设定为单路只写
·创建5读5写10条协程,观察读写锁效果
*/
func main() {
	var wg sync.WaitGroup

	//声明读写锁
	var rwm sync.RWMutex

	for i := 0; i < 5; i++ {
		wg.Add(1)
		go func() {
			//锁定为只读模式,运行多个协程同时抢到读锁
			rwm.RLock()
			fmt.Println("读取数据库")
			<-time.After(3*time.Second)

			//解读锁
			rwm.RUnlock()
			wg.Done()
		}()

		wg.Add(1)
		go func() {
			//锁定为写模式,只运行一个协程抢到写锁
			rwm.Lock()
			fmt.Println("写入数据库")
			<-time.After(3*time.Second)

			//解锁
			rwm.Unlock()
			wg.Done()
		}()
	}

	wg.Wait()
	fmt.Println("main over")
}

  

posted @ 2020-04-25 01:43  Ethan_Cheng  阅读(299)  评论(0编辑  收藏  举报