package main
import (
"fmt"
"sync"
"time"
)
type ConcurMap struct {
Data map[string]int
Lock *sync.RWMutex
}
func NewConcurMap() *ConcurMap{
return &ConcurMap{
Data: make(map[string]int),
Lock:&sync.RWMutex{},
}
}
func (d ConcurMap) Get(k string) int{
d.Lock.RLock()
defer d.Lock.RUnlock()
return d.Data[k]
}
func (d ConcurMap) Set(k string,v int) {
d.Lock.Lock()
defer d.Lock.Unlock()
d.Data[k]=v
}
func main(){
c := NewConcurMap()
go func() {//开一个协程写map
for j := 0; j < 1000000; j++ {
c.Set(fmt.Sprintf("%d", j),j)
}
}()
go func() { //开一个协程读map
for j := 0; j < 1000000; j++ {
fmt.Println(c.Get(fmt.Sprintf("%d",j)))
}
}()
time.Sleep(time.Second*20)
}
ConcurMap 定义的读写锁需要时指针类型,否则不会有预期的效果。
一定要将该锁定义为指针类型
对map统计
/ Count 统计key个数
func (m MutexMap) Count() int {
m.mu.RLock() // 加锁(读锁定)
count := len(m.items)
m.mu.RUnlock() // 解锁
return count
}
访问所有的key
// Keys 所有的key
func (m MutexMap) Keys() []string {
m.mu.RLock() // 加锁(读锁定)
keys := make([]string, len(m.items))
for k := range m.items {
keys = append(keys, k)
}
m.mu.RUnlock() // 解锁
return keys
}
对Map进行的所有读写操作都需要加锁🔐