07.rwLock - wwj-2017-1117/AES_OK GitHub Wiki

package main

// 01.level_0/go_workstation/41.DE/13.RW-V1.go import ( "fmt" "sync" "time" )

func test1() { var rwlock sync.RWMutex

read := func(i int) {
	fmt.Println(i, "read start...")

	rwlock.RLock()
	fmt.Println(i, "reading...")
	time.Sleep(1 * time.Second)
	rwlock.RUnlock()

	fmt.Println(i, "read over")
}

go read(1)
go read(2)

}

func main() { test1() time.Sleep(5 * time.Second) return }

/*

读写锁 读写锁(RWMutex)是根据互斥锁(Mutex)实现的。读写锁经常用于读远多于写的场景。 它可以针对读操作和写操作进行锁定和解锁。在读锁定管理的代码域内,允许任意的读操作同时进行。 读操作和写操作是互斥的,写操作和写操作也是互斥的

执行结果: 1 read start... 1 reading... 2 read start... 2 reading... 1 read over 2 read over

要点

l 读读操作不互斥,可以多个goroutine同时读锁定

2 读写操作互斥,所有的读锁定结束后才能进行写锁定

3 对没有读锁定的锁进行解锁,会引发一个panic

4 对读锁定进行写解锁,会引发一个panic */