国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

go中數(shù)組、切片、map是否線程(并發(fā))安全?

這篇具有很好參考價(jià)值的文章主要介紹了go中數(shù)組、切片、map是否線程(并發(fā))安全?。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

博客主頁(yè):??看看是李XX還是李歘歘???

??每天不定期分享一些包括但不限于計(jì)算機(jī)基礎(chǔ)、算法、后端開發(fā)相關(guān)的知識(shí)點(diǎn),以及職場(chǎng)小菜雞的生活。??

??點(diǎn)關(guān)注不迷路,總有一些??知識(shí)點(diǎn)??是你想要的???

目錄

什么是線程(并發(fā))安全?

非線程安全原因

map

解決方案

數(shù)組

解決方案

切片

解決方案

Go其他數(shù)據(jù)類型的并發(fā)安全性


先給出結(jié)論:在Go中數(shù)組、切片和map都是非線程安全的。

什么是線程(并發(fā))安全?

線程(并發(fā))安全是指程序在并發(fā)執(zhí)行或者多個(gè)線程同時(shí)操作的情況下,執(zhí)行結(jié)果還是正確的。

非線程安全原因

map

Go語(yǔ)言中的?map?在并發(fā)情況下,只讀是線程安全的,同時(shí)讀寫是線程不安全的。同一個(gè)變量在多個(gè)goroutine中訪問需要保證其安全性

因?yàn)?code>map變量為指針類型變量,并發(fā)寫時(shí),多個(gè)協(xié)程同時(shí)操作一個(gè)內(nèi)存,類似于多線程操作同一個(gè)資源會(huì)發(fā)生競(jìng)爭(zhēng)關(guān)系,共享資源會(huì)遭到破壞,因此golang出于安全的考慮,拋出致命錯(cuò)誤:fatal error: concurrent map writes

?非并發(fā)安全map(普通的map)

package main

import (
	"fmt"
	"strconv"
	"sync"
)

var m = make(map[string]int)

func get(key string) int {
	return m[key]
}

func set(key string, value int) {
	m[key] = value
}

func main() {
	wg := sync.WaitGroup{}
	for i := 0; i < 10; i++ {
		wg.Add(1)
		go func(n int) {
			key := strconv.Itoa(n)
			set(key, n)
			fmt.Printf("k=:%v,v:=%v\n", key, get(key))
			wg.Done()
		}(i)
	}
	wg.Wait()
}

解決方案

(1)在寫操作的時(shí)候增加鎖

package main

import (
	"fmt"
	"sync"
)

func main() {
	var lock sync.Mutex
	var maplist map[string]int
	maplist = map[string]int{"one": 1, "two": 2}
	lock.Lock()
	maplist["three"] = 3
	lock.Unlock()
	fmt.Println(maplist)
}

(2)sync.Map包

package main

import (
	"fmt"
	"sync"
)

func main() {
	m := sync.Map{} //或者 var mm sync.Map
	m.Store("a", 1)
	m.Store("b", 2)
	m.Store("c", 3)                             //插入數(shù)據(jù)
	fmt.Println(m.Load("a"))                    //讀取數(shù)據(jù)
	m.Range(func(key, value interface{}) bool { //遍歷
		fmt.Println(key, value)
		return true
	})
}

數(shù)組

指定索引進(jìn)行讀寫時(shí),數(shù)組是支持并發(fā)讀寫索引區(qū)的數(shù)據(jù)的,但是索引區(qū)的數(shù)據(jù)在并發(fā)時(shí)會(huì)被覆蓋的;

解決方案

1.加鎖

2.控制并發(fā)順序

切片

指定索引進(jìn)行讀寫:是支持并發(fā)讀寫索引區(qū)的數(shù)據(jù)的,但是索引區(qū)的數(shù)據(jù)在并發(fā)時(shí)可能會(huì)被覆蓋的;

發(fā)生切片動(dòng)態(tài)擴(kuò)容:并發(fā)場(chǎng)景下擴(kuò)容可能會(huì)被覆蓋。

切片是對(duì)數(shù)組的抽象,其底層就是數(shù)組,在并發(fā)下寫數(shù)據(jù)到相同的索引位會(huì)被覆蓋,并且切片也有自動(dòng)擴(kuò)容的功能,當(dāng)切片要進(jìn)行擴(kuò)容時(shí),就要替換底層的數(shù)組,在切換底層數(shù)組時(shí),多個(gè)goroutine是同時(shí)運(yùn)行的,哪個(gè)goroutine先運(yùn)行是不確定的,不論哪個(gè)goroutine先寫入內(nèi)存,肯定就有一次寫入會(huì)覆蓋之前的寫入,所以在動(dòng)態(tài)擴(kuò)容時(shí)并發(fā)寫入數(shù)組是不安全的;

解決方案

1.加互斥鎖
2.使用channel串行化操作
3.使用sync.map代替切片(github上著名的iris框架也曾遇到過(guò)切片動(dòng)態(tài)擴(kuò)容導(dǎo)致webscoket連接數(shù)減少的bug,最終采用sync.map解決了該問題,?采用sync.map解決切片并發(fā)安全)

Go其他數(shù)據(jù)類型的并發(fā)安全性

數(shù)據(jù)類型參考:

Go 中所有類型并發(fā)賦值的安全性。

(1)由一條機(jī)器指令完成賦值的類型并發(fā)賦值是安全的,這些類型有:字節(jié)型,布爾型、整型、浮點(diǎn)型、字符型、指針、函數(shù)。

(2)數(shù)組由一個(gè)或多個(gè)元素組成,大部分情況并發(fā)不安全。注意:當(dāng)位寬不大于 64 位且是 2 的整數(shù)次冪(8,16,32,64),那么其并發(fā)賦值是安全的。

(3)struct 或底層是 struct 的類型并發(fā)賦值大部分情況并發(fā)不安全,這些類型有:復(fù)數(shù)、字符串、 數(shù)組、切片、映射、通道、接口。注意:當(dāng) struct 賦值時(shí)退化為單個(gè)字段由一個(gè)機(jī)器指令完成賦值時(shí),并發(fā)賦值又是安全的。這種情況有:
(a)實(shí)部或虛部相同的復(fù)數(shù)的并發(fā)賦值;
(b)等長(zhǎng)字符串的并發(fā)賦值;
(c)同長(zhǎng)度同容量切片的并發(fā)賦值;
(d)同一種具體類型不同值并發(fā)賦給接口。
————————————————
版權(quán)聲明:本文為CSDN博主「戀喵大鯉魚」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/K346K346/article/details/115099353

這篇文章寫的很好,感謝博主,但是底層是 struct 的類型的channel是并發(fā)安全的,還有待博主回復(fù)

參考:

(43條消息) 【golang學(xué)習(xí)筆記】Go語(yǔ)言中參數(shù)的傳遞是值傳遞還是引用傳遞_Vivien_oO0的博客-CSDN博客_golang 切片是值傳遞還是引用傳遞

(43條消息) Go并發(fā)安全sync.Map_JIeJaitt的博客-CSDN博客

(43條消息) golang-數(shù)組,切片,map是否線程安全?_golang 切片線程安全_一顆簡(jiǎn)單的心的博客-CSDN博客?(43條消息) Go語(yǔ)言map使用和并發(fā)安全_行走的皮卡丘的博客-CSDN博客_go map并發(fā)安全

(43條消息) GoLang之切片并發(fā)安全問題_GoGo在努力的博客-CSDN博客_golang 切片線程安全文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-434773.html

到了這里,關(guān)于go中數(shù)組、切片、map是否線程(并發(fā))安全?的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【Go語(yǔ)言快速上手(三)】數(shù)組, 切片與映射

    【Go語(yǔ)言快速上手(三)】數(shù)組, 切片與映射

    ??博主CSDN主頁(yè):杭電碼農(nóng)-NEO?? ? ?專欄分類:Go語(yǔ)言專欄? ? ??代碼倉(cāng)庫(kù):NEO的學(xué)習(xí)日記?? ? ??關(guān)注我??帶你學(xué)習(xí)更多Go語(yǔ)言知識(shí) ? ???? 在了解過(guò)GO的控制語(yǔ)句和函數(shù)后,按照學(xué)習(xí)語(yǔ)言的邏輯也理應(yīng)進(jìn)入到容器的學(xué)習(xí),GO語(yǔ)言的容易比較特殊,它不像C++一樣有專門的STL庫(kù)

    2024年04月29日
    瀏覽(234)
  • Go語(yǔ)言中的數(shù)組、切片和映射解析

    Go語(yǔ)言中的數(shù)組、切片和映射解析

    數(shù)組存放的是固定長(zhǎng)度、相同類型的數(shù)據(jù),而且這些存放的元素是連續(xù)的。 例如聲明一個(gè)整形數(shù)組: 在類型名前加 [] 中括號(hào),并設(shè)置好長(zhǎng)度,大括號(hào)中的元素用于初始化數(shù)組,需要注意的是數(shù)組的長(zhǎng)度不同,即屬于不同的類型。 如果所有元素都被初始化的數(shù)組,聲明時(shí)可以

    2024年02月09日
    瀏覽(29)
  • Go 語(yǔ)言為什么建議多使用切片,少使用數(shù)組?

    大家好,我是 frank,「Golang 語(yǔ)言開發(fā)?!构娞?hào)作者。 01 介紹 在 Go 語(yǔ)言中,數(shù)組固定長(zhǎng)度,切片可變長(zhǎng)度;數(shù)組和切片都是值傳遞,因?yàn)榍衅瑐鬟f的是指針,所以切片也被稱為“引用傳遞”。 讀者朋友們?cè)谑褂?Go 語(yǔ)言開發(fā)項(xiàng)目時(shí),或者在閱讀 Go 開源項(xiàng)目源碼時(shí),發(fā)現(xiàn)很少

    2024年02月03日
    瀏覽(33)
  • 【Golang】Golang進(jìn)階系列教程--Go 語(yǔ)言數(shù)組和切片的區(qū)別

    【Golang】Golang進(jìn)階系列教程--Go 語(yǔ)言數(shù)組和切片的區(qū)別

    在 Go 語(yǔ)言中,數(shù)組和切片看起來(lái)很像,但其實(shí)它們又有很多的不同之處,這篇文章就來(lái)說(shuō)說(shuō)它們到底有哪些不同。 數(shù)組和切片是兩個(gè)常用的數(shù)據(jù)結(jié)構(gòu)。它們都可以用于存儲(chǔ)一組相同類型的元素,但在底層實(shí)現(xiàn)和使用方式上存在一些重要的區(qū)別。 Go 中數(shù)組的長(zhǎng)度是不可改變的

    2024年02月15日
    瀏覽(31)
  • Go 語(yǔ)言為什么不支持并發(fā)讀寫 map?

    大家好,我是 frank ,「 Golang 語(yǔ)言開發(fā)?!构娞?hào)作者。 01 介紹 在 Go 語(yǔ)言項(xiàng)目開發(fā)中,我們經(jīng)常會(huì)使用哈希表 map ,它的時(shí)間復(fù)雜度是 O(1) ,Go 語(yǔ)言中的 map 使用開放尋址法避免哈希碰撞。 Go 語(yǔ)言中的 map 并非原子操作,不支持并發(fā)讀寫操作。 Go 官方認(rèn)為 map 在大多數(shù)情況下

    2024年02月02日
    瀏覽(32)
  • 使用go_concurrent_map 管理 并發(fā)更新緩存

    在后臺(tái)服務(wù)中,為了提速,我在內(nèi)存還做了一個(gè)告訴緩存來(lái)管理用戶信息,根據(jù)更新通知,或者定時(shí)去redis中同步信息,那么在加載或者更新某個(gè)用戶元素時(shí),要防止并發(fā), 當(dāng): 1)如果內(nèi)存緩存沒有; 2)去數(shù)據(jù)庫(kù)或者redis加載; 3)添加到內(nèi)存緩存; 這里就有個(gè)并發(fā)重復(fù)的

    2024年04月25日
    瀏覽(18)
  • Go 自學(xué):map關(guān)聯(lián)數(shù)組

    以下代碼展示了如何建立一個(gè)map。 我們可以使用delete刪除map中的元素。 我們還可以使用loop遍歷map中的所有元素。 輸出為: List of all languages: map[JS:Javascript PY:Python RB:Ruby] JS shorts for: Javascript List of all languages: map[JS:Javascript PY:Python] For key JS, value is Javascript For key PY, value is Pytho

    2024年02月11日
    瀏覽(18)
  • 你是否想知道如何應(yīng)對(duì)高并發(fā)?Go語(yǔ)言為你提供了答案!

    你是否想知道如何應(yīng)對(duì)高并發(fā)?Go語(yǔ)言為你提供了答案!

    并發(fā)編程是當(dāng)前軟件領(lǐng)域中不可忽視的一個(gè)關(guān)鍵概念。隨著CPU等硬件的不斷發(fā)展,我們都渴望讓我們的程序運(yùn)行速度更快、更快。而Go語(yǔ)言在語(yǔ)言層面天生支持并發(fā),充分利用現(xiàn)代CPU的多核優(yōu)勢(shì),這也是Go語(yǔ)言能夠廣泛流行的一個(gè)重要原因。 在Java中,要支持高并發(fā)有幾種方案

    2024年02月04日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包