Go map併發讀寫異常導致服務崩潰

2022-08-24 18:51:08 字數 1377 閱讀 4364

昨天突然接到報警說服務埠丟失,也就是服務崩潰,看了錯誤日誌,發現是map併發讀寫問題,記錄下來,避免再犯類似錯誤。

發現是呼叫json.marshal時出錯了,錯誤統計如下,都是併發讀寫map之類的異常。

229次錯誤:fatal error: concurrent map iteration and map write

193次錯誤:fatal error: concurrent map writes

129次錯誤:fatal error: concurrent map read and map write

func getfeaturemap(ctx context.context, filters *model.filterstype, driverid int64) map[string]string , param) // 114行

}...

}

看起來就是傳入的param這個map被多個協程併發寫了,filterrule.filtermap是全域性變數,所以這裡需要修改為深拷貝。

// deepcopymap map[string]string 型別實現深拷貝

func deepcopymap(params map[string]string) map[string]string

for k, v := range params

return result

}

param := filterrule.filtermap修改為param := deepcopymap(filterrule.filtermap)

package main

import (

"encoding/json"

"fmt"

"math/rand"

"strconv"

"sync"

"time"

)func main()

f := func(i int)

var wg sync.waitgroup

for i := 0; i < 1000; i++ (i)

} wg.wait()

fmt.println("finish")

}// deepcopymap map[string]string 型別實現深拷貝

func deepcopymap(params map[string]string) map[string]string

for k, v := range params

return result

}

執行上述**,很容易報以下其中乙個或多個的錯誤。

未導包導致的異常

剛接觸servlet,今天將servlet和hibernate結合起來往資料庫裡面儲存資料,報了好多異常,總結了幾個如下 導slf4j api 1.6.1.jar 2.slf4j failed to load class org.slf4j.impl.staticloggerbinder slf4j...

併發 讀寫鎖初探

兩個執行緒同時讀取同乙個共享資源沒有任何問題 如果乙個執行緒對共享資源進行寫操作,此時就不能有其他執行緒對共享資源進行讀寫 讀操作觸發條件 沒有執行緒正在執行寫操作 沒有執行緒在等待執行寫操作 寫操作觸發條件 沒有執行緒正在執行讀寫操作 readwritelockl類中通過讀鎖 寫鎖以兩個鎖的狀態控...

併發 讀寫鎖初探

public class readwritelock readers public synchronized void unlockread public synchronized void lockwrite throws interruptedexception writerequests wr...