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
}
// 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
}