golang sync.Mutex阻塞问题

package main

import (

"sync"

)

type data struct {

sync.Mutex

}
func (d data)test(s string){

d.Lock()
defer d.Unlock()
for i:=0;i<5 ;i++  {
    println(s,i)
    //time.Sleep(time.Second)
}

}
func test_lock(){

var wg sync.WaitGroup
wg.Add(3)
var d data
go func() {
    defer wg.Done()
    d.test("write")
}()
go func() {
    defer wg.Done()
    d.test("read")
}()
go func() {
    defer wg.Done()
    d.test("new")
}()
wg.Wait()

}
func main(){

test_lock()

}

clipboard.png
d.lock阻塞,不是应该write全部打完再打印其他的吗?为啥write打印一部分后new可以获得锁

阅读 2.4k
2 个回答

func (d data)test(s string){

d.Lock()
defer d.Unlock()
for i:=0;i<5 ;i++ {

println(s,i)
//time.Sleep(time.Second)

}
}
指针的问题,(d data)相当于复制了多个锁给协程用,(d *data)就变成一个锁,就没问题了

func (d *data) test(s string) {

    d.Lock()
    defer d.Unlock()
    for i := 0; i < 5; i++ {
        println(s, i)
        //time.Sleep(time.Second)
    }
}

function (d data) test() 你这样穿的是值, 所以得到是一份拷贝

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题