核心源码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import(
	"sync/atomic"
    "unsafe"
)
//核心数据结构
//删除不是直接删除,而是直接打标记,是有在晋升dirty的时候才清理删除的数据。
type Map struct{
    mu mutex
    //read包含map中可以被安全并发访问的内容,read总是可以被安全load,但是只能和mu一起store
    //read中的数据可以不用mu锁就并发更新,但是要修改之前expunged的数据就需要将数据复制dirty区,
    read atomic.Value
    //dirty  包含map中需要持有mu锁的数据。
    //它包含所有read中expunged和unexpunged的数据。新增加的entries会加入到dirty.
    //删除的entries 没有储存在dirty map 中。
    dirty map[interface{}]* entry//包含最新写入的数据,当,misses计数达到一定值,将其值赋给read
    misser int// 计数作用,每次从read中读取失败,则计数加1
}
//readonly
type readonly struct{
    m map[interface{}]* entry 
    amended bool //map.dirty的数据和这里的m中的数据不一样的时候,为true
    //如果read找不到数据的时候会在dirty中找。
}
//entry 这里map.dirty和readonly.m中的数据是冗余的,但是他们储存的指针,指向了同一个数据,所以并没有占用太多的空间。
type entry struct{
    p unsafe.Pointer
    //p 有三种值,nil :entry已经被删除了,并且dirty为nil
    // expunged :entry已经被删除了,并且dirty不为nil,而且这个entry不存在于dirty中
    //正常值
}

使用方法:

1
2
3
4
//Load 查找
//store 
//delete
//range

//append不是安全方法