《零基础Go语言算法实战》
【题目 2-30】并发安全问题
请举例说明如何在 Go 语言的 map 中保证并发安全,且需要实现以下接口:
type sp interface {
Out(key string, val interface{})
}
【解答】
题目中要求并发安全,那么必须用锁,还要实现多个 goroutine 在读的时候如果值不存在
则阻塞,直到写入值,那么每个键值都需要有一个阻塞 goroutine 的通道。实现如下:
type Map struct {
c map[string]*entry
rmx *sync.RWMutex
}
type entry struct {
ch chan struct{}
value interface{}
69
零基础
Go语言算法实战
70
isExist bool
}
func (m *Map) Out(key string, val interface{}) {
m.rmx.Lock()
defer m.rmx.Unlock()
item, ok := m.c[key]
if !ok {
m.c[key] = &entry{
value: val,
isExist: true,
}
return
}
item.value = val
if !item.isExist {
if item.ch != nil {
close(item.ch)
item.ch = nil
}
}
return
}