深入理解Java虚拟机到底是什么_java虚拟机是什么-CSDN博客
Golang-100-Days/Day16-20(Go语言基础进阶)/day17_Go语言并发Goroutine.md at master · rubyhan1314/Golang-100-Days · GitHub
runtime
类似jvm,runtime包也提供了垃圾回收功能,不同的是runtime包提供的是可执行文件.go,jvm是系统级进程。
调度器中的常用方法
临界资源
多条协程对公共资源tickets的操作
var tickets = 10 var wg sync.WaitGroupfunc 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) 写锁上锁,其他写锁不能上锁。