Я читал о goroutines и пакете синхронизации, и мой вопрос ... Всегда ли мне нужно блокировать разблокировку при чтении писем к данным на разных goroutines?Go goroutine lock and unlock
Например, у меня есть переменная на моем сервере
config := make(map[string]string)
Тогда на разных goroutines я хочу прочитать от конфигурации. Безопасно ли читать без использования синхронизации, или нет?
Я предполагаю, что написание должно быть выполнено с использованием пакета синхронизации. но я не уверен, что чтение
Например, у меня есть простая система кэширования в оперативной памяти
type Cache interface {
Get(key string) interface{}
Put(key string, expires int64, value interface{})
}
// MemoryCache represents a memory type of cache
type MemoryCache struct {
c map[string]*MemoryCacheValue
rw sync.RWMutex
}
// MemoryCacheValue represents a memory cache value
type MemoryCacheValue struct {
value interface{}
expires int64
}
// NewMemoryCache creates a new memory cache
func NewMemoryCache() Cache {
return &MemoryCache{
c: make(map[string]*MemoryCacheValue),
}
}
// Get stores something into the cache
func (m *MemoryCache) Get(key string) interface{} {
if v, ok := m.c[key]; ok {
return v
}
return nil
}
// Put retrieves something from the cache
func (m *MemoryCache) Put(key string, expires int64, value interface{}) {
m.rw.Lock()
m.c[key] = &MemoryCacheValue{
value,
time.Now().Unix() + expires,
}
m.rw.Unlock()
}
Я действую здесь в безопасности или мне еще нужно заблокировать разблокировать, когда я хочу только читать?
Я бы избавиться от фальшивых, например гонок, так как ни один не относится к реализации идут карты, ни строк, и это своего рода заблуждение. В первых примерах вы также смешиваете 'o' и' m', а также ссылаетесь на методы Mutex как встроенное поле, но определяете его как 'mutex'. – JimB
Исправлено по рекомендации. – Kaedys