08.rwlock - wwj-2017-1117/AES_OK GitHub Wiki

package main

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

func test2() { var rwlock sync.RWMutex var v int

read := func(i int) {

	rwlock.RLock()
	fmt.Println(i, "read start")
	fmt.Println(i, "reading v is ", v)
	time.Sleep(1 * time.Second)
	rwlock.RUnlock()
	fmt.Println(i, "read end")
}

write := func(i int) {

	rwlock.Lock()
	fmt.Println(i, "write start")

	v = i
	time.Sleep(1 * time.Second)
	fmt.Println(i, "write", i, "to v")
	rwlock.Unlock()

	fmt.Println(i, "write end")
}

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

}

func main() { test2()

time.Sleep(10 * time.Second)
return

}

/* 执行结果: 1 write start 1 write 1 to v 1 write end 2 read start 2 reading v is 1 4 read start 4 reading v is 1 4 read end 2 read end 3 write start 3 write 3 to v 3 write end

可以看到读操作和写操作都是互斥的: 1.读操作期间不会有写操作; 2.写操作期间不会有读操作; 3.同时写操作和写操作之间也是互斥的。

要点:

l 读写锁定是互斥的,写锁定结束后才能进行读锁定

2 写写锁定是互斥的,同一时刻只有一个写锁定。

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

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