go語言映射map的線程協程安全問題

來源:互聯網
上載者:User
見代碼中注釋:
package mainimport (       "fmt"       "sync")func main()  {       m := map[string]int{"a":1, "b":2, "c":3, "d":4, "e":5, "f":6}       fmt.Println(m)       fmt.Println("-------")       wg := &sync.WaitGroup{}       wg.Add(3)       go func(p map[string]int) {              defer wg.Done()              p["a"] = 10       }(m) //因為go語言中的map為參考型別, 雖然go語言函數以傳值方式調用,即函數持有的為參數副本,但因是參考型別, 故依然指向映射m , 類似c的指標.       go func(p map[string]int) {              defer wg.Done()              p["a"] = 11       }(m)       go func(p map[string]int) {              defer wg.Done()              p["a"] = 12       }(m)       wg.Wait()       fmt.Println(m)
 
/*
因為map為參考型別,所以即使函數傳值調用,參數副本依然指向映射m, 所以3個goroutine並發寫同一個映射m, 寫過多線程程式的同學都知道,對於共用變數,資源,
並發讀寫會產生競爭的, 故共用資源遭到破壞, 所以要麼加鎖, 要麼用channel排隊序列化, 總之要排他訪問。
所以切記: 多goroutine讀寫同一個映射時, 要保護喲, 加鎖也可, 利用channel序列化處理也可。。。
*/}
 
注意: 此文章只是我個人筆記, 如有錯漏,請一定指正, 共同學習, 我的郵箱: htyu_0203_39@sina.com
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.