2 回答

TA貢獻1966條經(jīng)驗 獲得超4個贊
如果你沒有獲取 RLock 來讀取syncProducer,那就是數(shù)據(jù)競爭,因為另一個 goroutine 可能會更新它。
如果你假設(shè)對指針變量的讀/寫是原子的,這看起來是無害的——活潑的讀syncProducer永遠不會導(dǎo)致不正確的行為。如果你不做這個原子假設(shè),如果你不走運的話,讀取可能只產(chǎn)生指針的一些字節(jié),你的程序就會崩潰。
根據(jù)您使用的體系結(jié)構(gòu)、機器字長、編譯器版本等,這可能會也可能不會。但這RLock避免了任何擔(dān)憂。
與其顯式地亂用 RWLocks,不如使用它(假設(shè)目標(biāo)是懶惰地初始化一個變量):
var (
syncOnce sync.Once
syncProducerInternal *syncProducerType
)
func syncProducer() *syncProducerType {
syncOnce.Do(func() { syncProducerInternal = createSyncKafkaProducer() })
return syncProducerInternal
}
然后需要同步生產(chǎn)者的代碼可以調(diào)用該syncProducer()函數(shù)來獲取它,而永遠不會看到 nil 指針。
- 2 回答
- 0 關(guān)注
- 183 瀏覽
添加回答
舉報