在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/GO/ golang 會自動加鎖保證并發(fā)安全嗎?

golang 會自動加鎖保證并發(fā)安全嗎?

golang 的版本是 1.9.2

最近接觸 golang 的并發(fā)加鎖功能,按照例子做了一個多 goroutine 計數(shù)的練習(xí),發(fā)現(xiàn)加鎖和不加鎖的運行結(jié)果是一樣的,請問這是機器的緣故嗎?(至少在我的電腦上和 https://play.golang.org/ 上模擬是這樣的) 還是說 1.9 版本的 go 已經(jīng)不用 mutex 鎖數(shù)據(jù)了?如果是我的測試方法的問題,那么如何能正確的方式測試出加鎖和不加鎖的區(qū)別呢?

代碼如下:

package main

import (
    "fmt"
    "sync"
    "time"
)

type SafeCounter struct {
    v  map[string]int
    mux sync.Mutex
}

func (c *SafeCounter) Inc(key string) {

    c.mux.Lock()

    c.v[key]++

    c.mux.Unlock()
}

func (c *SafeCounter) Value(key string) int {

    defer c.mux.Unlock()

    c.mux.Lock()

    return c.v[key]
}

func main() {
    c := SafeCounter{
        v: make(map[string]int),
    }

    for i := 0; i < 1000; i++ {
        go c.Inc("somekey")
    }

    time.Sleep(time.Second)

    fmt.Println(c.Value("somekey"))
}

輸出結(jié)果是 1000
把所有的鎖去掉,還是 1000

回答
編輯回答
風(fēng)清揚

不會,并且go不保證所有的goroutine是同步執(zhí)行的,并且還會對語句進行重新排序(一個goroutine監(jiān)測到的執(zhí)行順序可能與另一個goroutine監(jiān)測到的不同)

使用sync和sync/atomic包保證線程同步與線程安全

http://docscn.studygolang.com...
https://golang.org/ref/mem

2017年4月18日 18:24
編輯回答
鐧簞噯

不要抱有僥幸心理,map不加鎖肯定會崩的,到了線上直接是程序異常退出,你的例子沒有問題,可能多跑幾趟才會出現(xiàn)panic,你嘗試使用go run -race main.go,檢查下有沒有數(shù)據(jù)競爭。

2017年11月21日 10:19
編輯回答
初心

很明顯不會,雖然用golang的地方大多都會涉及到并發(fā)安全處理,所以我在項目中封裝了很多并發(fā)安全的包以及類型:http://gf.johng.cn/494392

順便提一下,golang的atomic原子操作是所有鎖機制中效率最高的,能夠使用原子操作的地方,就盡量用原子操作吧。我實現(xiàn)的并發(fā)安全基本類型gtype包底層大多數(shù)也是基于atomic。

2017年9月7日 09:13
編輯回答
遲月
  • 原生的map是非線程安全的。從go1.6開始,runtime會對并發(fā)讀寫map進行檢測,一旦檢測到有并發(fā)讀寫map的情況,會引發(fā)crash。
  • sync.Map是線程安全的。
2018年6月7日 02:44