深入理解Java虚拟机到底是什么_java虚拟机是什么-CSDN博客
Golang-100-Days/Day16-20(Go语言基础进阶)/day17_Go语言并发Goroutine.md at master · rubyhan1314/Golang-100-Days · GitHub
runtime
类似jvm,runtime包也提供了垃圾回收功能。
并且jvm实现了对线程创建销毁调度,runtime包下提供了创建协程,控制协程的功能。
调度器中的常用方法
临界资源
多条协程对公共资源tickets的操作
var tickets = 10 var wg sync.WaitGroup func main() { wg.Add(4) go buyTickets() go buyTickets() go buyTickets() go buyTickets() wg.Wait() } func buyTickets() { for i := 10; i > 0; i-- { if tickets > 0 { time.Sleep(time.Duration(rand.Intn(1000)) * time.Millisecond) tickets-- fmt.Println("售出一张票", "当前票还有", tickets, "张") } else { fmt.Println("票售罄", tickets) break } } wg.Add(-1) }
运行结果:
数据并不安全。
sync包
Mutex类的互斥锁
RWMutex类的读写锁
是在互斥锁的基础上完成的,读锁 写锁就是两个互斥锁。
1) 读锁上锁,写锁不能再上锁。
2) 读锁上锁,不影响读锁再上锁;
3) 写锁上锁,其他写锁不能上锁。