通过 read 字段修改 Map 也不会有并发问题吗?

来源:4-7 怎么解决map的并发问题?(一)

弦歌ty

2022-05-17

  • 视频里说读写都是通过 read 字段进行操作的,但是源码里面说了这个字段是 readOnly,那是怎么修改的呢?
  • 或者说 readOnly 的意思只是这个指针不修改,而指向的 map 内容可以修改?
  • 如果一边读一边改不会有问题吗?
// readOnly is an immutable struct stored atomically in the Map.read field.
type readOnly struct {
	m       map[any]*entry
	amended bool // true if the dirty map contains some key not in m.
}
写回答

1回答

Moody

2022-05-17

1.我理解应该是指向的map内容可以修改

2.操作具体的value时候用的是原子操作(atomic),可以避免并发问题,atomic原理可以在后面的章节看到

func (e *entry) tryStore(i *interface{}) bool {
   for {
      p := atomic.LoadPointer(&e.p)
      if p == expunged {
         return false
      }
      if atomic.CompareAndSwapPointer(&e.p, p, unsafe.Pointer(i)) {
         return true
      }
   }


2
1
弦歌ty
好的,谢谢
2022-05-17
共1条回复

深入Go底层原理,重写Redis中间件实战

深入Go语言原理+Go重写Redis

474 学习 · 172 问题

查看课程