第11课:Go语言锁机制

Go语言并发能力很强,但是一旦涉及到并发,就需要很多的读写控制即锁定控制,防止数据出错

这里主要讲读写锁RWMutex,读写锁是针对读写的互斥锁
基本遵循两大原则:
1.可以并行读,多个goroutine同时读
2.写的时候要锁定,啥也不能干,不能读也不能写,防止冲突

RWMutex提供了四个方法:
func (*RWMutex) Lock // 写锁定
func (*RWMutex) Unlock // 写解锁
func (*RWMutex) RLock // 读锁定
func (*RWMutex) RUnlock // 读解锁

1.并行读
package main

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

var m *sync.RWMutex

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

	go read(1)
	go read(2)

	time.Sleep(2 * time.Second)
}
func read(i int) {
	fmt.Println(i, "read start")

	m.RLock()
	fmt.Println(i, "reading")
	time.Sleep(1 * time.Second)
	m.RUnlock()
	fmt.Println(i, "read over")
}
可以看出1 读还没有结束,2已经在读

2.互斥写,写的时候无法再读写
package main

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

var m *sync.RWMutex

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

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

	time.Sleep(2 * time.Second)
}
func read(i int) {
	fmt.Println(i, "read start")

	m.RLock()
	fmt.Println(i, "reading")
	time.Sleep(1 * time.Second)
	m.RUnlock()
	fmt.Println(i, "read over")
}
func write(i int) {
	fmt.Println(i, "write start")
	m.Lock()
	fmt.Println(i, "writing")
	time.Sleep(1 * time.Second)
	m.Unlock()
	fmt.Println(i, "write over")
}