【有碼】go併發操作map的錯誤用例
map 在併發中是不安全的,需要用鎖。 錯誤的用鎖,依舊會報錯,如下程式碼是錯誤的用法,那麼問題來了,正確的應該是啥呢?
fatal error: concurrent map read and map write
package main
import (
"fmt"
"math"
"sync"
"time"
)
const MAX_TRFFIC uint64 = 10
type IpTriffic struct {
Num uint64
Period int
}
type Trffic struct {
sync.Mutex
Period int
List map[string]uint64
}
func (m *Trffic) GetPeriod() int {
period := math.Ceil(float64(time.Now().Unix() / 600))
return int(period)
}
func (m *Trffic) ClearList() {
m.Lock()
m.List = make(map[string]uint64)
m.Unlock()
}
func (m *Trffic) IncByKey(key string) {
m.Lock()
if _, ok := m.List[key]; !ok {
m.List[key] = 1
} else {
m.List[key]++
if m.List[key] > MAX_TRFFIC {
fmt.Println("超過最大值", m.List[key])
} else {
fmt.Println(m.List[key])
}
}
m.Unlock()
}
func (m *Trffic) Passport(key string) {
period := m.GetPeriod()
fmt.Println(period)
/*if m.Period != period {
m.ClearList()
}
*/
m.IncByKey(key)
}
var tc *Trffic
func init() {
tc = &Trffic{}
tc.Period = int(time.Now().Unix() / 600)
tc.List = make(map[string]uint64)
}
func main() {
for i := 0; i < 10000; i++ {
go func() {
tc.Passport("golang")
}()
}
fmt.Println(tc.List, tc.Period)
}
更多原創文章乾貨分享,請關注公眾號
- 加微信實戰群請加微信(註明:實戰群):gocnio
相關文章
- go 併發 mapGo
- Go 併發 2.2:錯誤處理模式Go模式
- Go 併發操作Go
- 優化 Go 中的 map 併發存取優化Go
- Go多協程併發環境下的錯誤處理Go
- 記一次go中map併發引起的事故Go
- Go 併發讀寫 sync.map 的強大之處Go
- GO安全併發之無鎖原子操作Go
- Go 為什麼不在語言層面支援 map 併發?Go
- Go語言的100個錯誤使用場景(55-60)|併發基礎Go
- Go語言的100個錯誤使用場景(61-68)|併發實踐Go
- Go併發程式設計之美-CAS操作Go程式設計
- go的錯誤處理Go
- [Golang併發]Sync.mapGolang
- Go的併發沒有它,就像iphone沒有網路一樣GoiPhone
- Golang 基礎學習之Go map操作Golang
- Go高效併發 11 | 併發模式:Go 語言中即學即用的高效併發模式Go模式
- javascript模擬jQuery的map()方法程式碼例項mapJavaScriptjQuery
- git合併丟失程式碼問題分析與解決(錯誤操作導致)Git
- 用go實現併發聊天室Go
- Go 錯誤處理Go
- 一個小例子,給你講透典型的 Go 併發操作Go
- go sync.Map原始碼分析Go原始碼
- Go併發原理Go
- Go 併發 -- 通道Go
- go併發 - channelGo
- Go併發程式設計之原子操作sync/atomicGo程式設計
- Go - 使用 sync.WaitGroup 來實現併發操作GoAI
- Go中的MapGo
- 用Go例項學習Protobuf編碼Go
- php檔案操作錯誤程式碼說明PHP
- Go 常見錯誤集錦之 append 操作 slice 時的副作用GoAPP
- 閃回 錯誤的DML 操作
- Go 呼叫 elasticsearch 批量操作介面 “/_bulk” ,提示"\n"錯誤GoElasticsearch
- Go語言中的併發模式Go模式
- 軟體測試用例的認識誤區有哪些?
- Go 高階併發Go
- Go 併發 -- 協程Go