代码
package main
import (
"log"
"os"
"runtime/trace"
"sync"
"syscall"
"time"
)
type Dog struct {
mu sync.Mutex
name string
}
func (d *Dog) Name() {
d.mu.Lock()
time.Sleep(200 * time.Millisecond)
d.mu.Unlock()
}
func traceProfile() {
f, err := os.OpenFile("trace.out", syscall.O_CREAT|syscall.O_RDWR, os.ModePerm)
if err != nil {
log.Fatal(err)
}
log.Println("Trace started")
trace.Start(f)
defer trace.Stop()
d := &Dog{}
for i := 0; i < 100; i++ {
go func() {
d.Name()
}()
}
time.Sleep(10 * time.Second)
}
func main() {
traceProfile()
}
结果
所有的g,都阻塞在Dog.Name方法上