面试题答案
一键面试package main
import (
"fmt"
"sync"
"sync/atomic"
)
type SafeMap struct {
data map[string]int
mu sync.RWMutex
count uint64
}
func NewSafeMap() *SafeMap {
return &SafeMap{
data: make(map[string]int),
}
}
func (sm *SafeMap) Insert(key string, value int) {
sm.mu.Lock()
defer sm.mu.Unlock()
sm.data[key] = value
atomic.AddUint64(&sm.count, 1)
}
func (sm *SafeMap) Delete(key string) {
sm.mu.Lock()
defer sm.mu.Unlock()
delete(sm.data, key)
atomic.AddUint64(&sm.count, ^uint64(0))
}
func (sm *SafeMap) Query(key string) (int, bool) {
sm.mu.RLock()
defer sm.mu.RUnlock()
value, exists := sm.data[key]
return value, exists
}
func (sm *SafeMap) Count() uint64 {
return atomic.LoadUint64(&sm.count)
}
在实现过程中:
- 互斥锁(Mutex):使用
sync.RWMutex
来保护哈希表的数据。在插入和删除操作时,使用写锁(Lock
),以确保同一时间只有一个协程可以修改哈希表,避免数据竞争。在查询操作时,使用读锁(RLock
),允许多个协程同时进行查询,提高并发性能。 - 原子操作:使用
atomic
包中的函数来对元素个数进行原子操作。例如,在插入时使用atomic.AddUint64
增加元素计数,删除时使用atomic.AddUint64
减少元素计数,这样可以保证在并发环境下元素计数的准确性,不受其他协程干扰,确保数据的一致性和安全性。