Go的sync.RWMutex(六)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/fujian9544/article/details/100538286

RWMutex

RWMutex有两种锁写锁和读锁,用法也有不同,首先读锁可以同时加多个,但是写锁就不行 只能1个

给资源可以加多个读锁或者一个写锁,其经常用于读次数远远多于写次数的场景.

原则

读锁的时候别的协程也可以读,但是不可以写

写锁的时候其他协程都不可以操作,不可以读也不可以写

操作

  • RLock() //读锁定 
  • RUnlock() //读解锁
  • Lock() //写锁定 
  • Unlock() //写解锁

实例

package main

import (
	"sync"
	"time"
)

var m *sync.RWMutex

func main() {
	m = new(sync.RWMutex)

	go write(1)
	go read(2)
	go write(3)

	time.Sleep(7 * time.Second)
}

// RWMUX是控制协程对于资源的改变顺序的
// RLOCK RULOCK
// LOCK ULOCK
// 在一个协程里面
// 对资源的
// 读锁的时候别的也可以读,但是不可以写
// 写锁的时候都不可以操作,不可以读也不可以写

func read(i int) {
	println(i, "read start")

	m.RLock()
	println(i, "reading")
	time.Sleep(1 * time.Second)
	m.RUnlock()

	println(i, "read over")
}

func write(i int) {
	time.Sleep(1 * time.Second)

	println(i, "write start")

	m.Lock()
	println(i, "writing")
	time.Sleep(2*time.Second)
	m.Unlock()

	println(i, "write over")
}

// 2 read start
// 2 reading
// 3 write start
// 1 write start
// 2 read over
// 3 writing
// 3 write over
// 1 writing
// 1 write over

 

猜你喜欢

转载自blog.csdn.net/fujian9544/article/details/100538286
今日推荐