关于sync.Mutex 如何具体使用?

type a struct {
AAA sync.Mutex
BBB map[string]string
}
aaa := &a{AAA:&sync.Mutex{} ,BBB: map[string]string{} }
aaa.Lock()
go——
上面这个, 我目的是暂时锁住BBB,防止和其他gorutine冲突.
但是Lock()之后未解锁,测试发现其他go程还是可以读写.

请问,具体如何使用? 现在还是没明白,这个锁的具体机制是什么. 是做住整个a结构体的所有成员吗?

共 2 个回复


stevewang

mutex只是不让多个goroutine同时读写特定数据,但是没有办法让其他goroutine无法访问特定数据。

# 0

heimeil

要自己封装方法来代理访问,在方法内实现锁控制

func XXX() {
    Lock()  // 方法开始即锁住
    defer Unlock()  // 方法结束时解锁

    // 访问逻辑
}

再将这个方法暴露给外部调用而不是直接访问属性就行了。
在外部直接访问属性就得在每个访问的地方加锁,用完再解锁,这样写也是可以的,但比较繁琐也难维护,先封装一个访问方法就比较方便统一控制,类似于Java/C#里面的get/set访问控制。

# 1