Go 初體驗 - 閉包,數組,切片,鎖

咱們先假設一個需求,建立一個數組,裏面存放 0 - 99 的整數。數組

上代碼:閉包

輸出:app

然而並非咱們想要的結果,不少重複數值。函數

釋義:3d

12行這個閉包函數對 i 的傳遞並不是深拷貝,而是傳遞了變量指針,也就意味着多個協程訪問的時候操做的是同一塊內存。指針

當某一個協程修改了i的值,致使多個協程append的時候i的值發生變化,簡單的說就是一個更改,多個讀取同時存在,不少個協程都讀到某個數值,好比是14,多個協程執行後你們的結果都是同樣,是15.協程

咱們升級下代碼:blog

 

輸出:內存

咱們能夠看到第2行的輸出94,若是沒有多運行幾回,少於100,也就是說發生了數據丟失,這是爲什麼?資源

這就是競態,由於多個協程同時訪問臨界區,程序並非按照前後順序去執行,多個協程搶佔資源,這就致使一部分協程沒有獲得資源。

解決的辦法不少,這裏講解下互斥鎖和更換數據類型

辦法1:換數據類型

切片不一樣於數組,在每次append的時候咱們會伴隨着內存copy以達到自動擴容目的,在A協程讀出a的內存數據時,B協程完成了寫入操做,此時A繼續append並賦值就會致使,協程B的更新結果丟失。
假如咱們將切片換成數組就不存在這個問題:

穩定輸出:

2:互斥鎖

輸出元素的次序沒有規律,可是個數很穩定:

也就是說沒有丟失數據

相關文章
相關標籤/搜索