日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
關(guān)于Go并發(fā)編程之Mutex

下面由golang教程欄目給大家介紹 Go 并發(fā)編程之 Mutex,希望對(duì)需要的朋友有所幫助!

創(chuàng)新互聯(lián)建站是一家集網(wǎng)站建設(shè),武勝企業(yè)網(wǎng)站建設(shè),武勝品牌網(wǎng)站建設(shè),網(wǎng)站定制,武勝網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷(xiāo),網(wǎng)絡(luò)優(yōu)化,武勝網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專(zhuān)業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。

友情提示:此篇文章大約需要閱讀 5分鐘45秒,不足之處請(qǐng)多指教,感謝你的閱讀。

我們比較常見(jiàn)的大型項(xiàng)目的設(shè)計(jì)中都會(huì)出現(xiàn)并發(fā)訪問(wèn)問(wèn)題,并發(fā)就是為了解決數(shù)據(jù)的準(zhǔn)確性,保證同一個(gè)臨界區(qū)的數(shù)據(jù)只能被一個(gè)線程進(jìn)行操作,日常中使用到的并發(fā)場(chǎng)景也是很多的:

計(jì)數(shù)器:計(jì)數(shù)器結(jié)果不準(zhǔn)確;秒殺系統(tǒng):由于同一時(shí)間訪問(wèn)量比較大,導(dǎo)致的超賣(mài);用戶賬戶異常:同一時(shí)間支付導(dǎo)致的賬戶透支;buffer 數(shù)據(jù)異常:更新 buffer 導(dǎo)致的數(shù)據(jù)混亂。

上面都是并發(fā)帶來(lái)的數(shù)據(jù)準(zhǔn)確性的問(wèn)題,決絕方案就是使用互斥鎖,也就是今天并發(fā)編程中的所要描述的 Mutex 并發(fā)原語(yǔ)。

實(shí)現(xiàn)機(jī)制

互斥鎖 Mutex 就是為了避免并發(fā)競(jìng)爭(zhēng)建立的并發(fā)控制機(jī)制,其中有個(gè)“臨界區(qū)”的概念。

在并發(fā)編程過(guò)程中,如果程序中一部分資源或者變量會(huì)被并發(fā)訪問(wèn)或者修改,為了避免并發(fā)訪問(wèn)導(dǎo)致數(shù)據(jù)的不準(zhǔn)確,這部分程序需要率先被保護(hù)起來(lái),之后操作,操作結(jié)束后去除保護(hù),這部分被保護(hù)的程序就叫做臨界區(qū)。

使用互斥鎖,限定臨界區(qū)只能同時(shí)由一個(gè)線程持有,若是臨界區(qū)此時(shí)被一個(gè)線程持有,那么其他線程想進(jìn)入到這個(gè)臨界區(qū)的時(shí)候,就會(huì)失敗或者等待釋放鎖,持有此臨界區(qū)的線程退出,其他線程才有機(jī)會(huì)獲得這個(gè)臨界區(qū)。

go mutex 臨界區(qū)示意圖

Mutex 是 Go 語(yǔ)言中使用最廣泛的同步原語(yǔ),也稱(chēng)為并發(fā)原語(yǔ),解決的是并發(fā)讀寫(xiě)共享資源,避免出現(xiàn)數(shù)據(jù)競(jìng)爭(zhēng) data race 問(wèn)題。

基本使用

互斥鎖 Mutex 提供了兩個(gè)方法 Lock 和 Unlock:進(jìn)入到臨界區(qū)使用 Lock 方法加鎖,退出臨界區(qū)使用 Unlock 方法釋放鎖。

type Locker interface {
    Lock()
    Unlock()}func(m *Mutex)Lock()func(m *Mutex)Unlock()

當(dāng)一個(gè) goroutine 調(diào)用 Lock 方法獲取到鎖后,其他 goroutine 會(huì)阻塞在 Lock 的調(diào)用上,直到當(dāng)前獲取到鎖的 goroutine 釋放鎖。

接下來(lái)是一個(gè)計(jì)數(shù)器的例子,是由 100 個(gè) goroutine 對(duì)計(jì)數(shù)器進(jìn)行累加操作,最后輸出結(jié)果:

package mainimport (
    "fmt"
    "sync")func main() {
    var mu sync.Mutex
    countNum := 0

    // 確認(rèn)輔助變量是否都執(zhí)行完成
    var wg sync.WaitGroup    // wg 添加數(shù)目要和 創(chuàng)建的協(xié)程數(shù)量保持一致
    wg.Add(100)
    for i := 0; i < 100; i++ {
        go func() {
            defer wg.Done()
            for j := 0; j < 1000; j++ {
                mu.Lock()
                countNum++
                mu.Unlock()
            }
        }()
    }
    wg.Wait()
    fmt.Printf("countNum: %d", countNum)}
實(shí)際使用

很多時(shí)候 Mutex 并不是單獨(dú)使用的,而是嵌套在 Struct 中使用,作為結(jié)構(gòu)體的一部分,如果嵌入的 struct 有多個(gè)字段,我們一般會(huì)把 Mutex 放在要控制的字段上面,然后使用空格把字段分隔開(kāi)來(lái)。

甚至可以把獲取鎖、釋放鎖、計(jì)數(shù)加一的邏輯封裝成一個(gè)方法。

package mainimport (
    "fmt"
    "sync")// 線程安全的計(jì)數(shù)器type Counter struct {
    CounterType int
    Name        string

    mu    sync.Mutex
    count uint64}// 加一方法func (c *Counter) Incr() {
    c.mu.Lock()
    defer c.mu.Unlock()
    c.count++}// 取數(shù)值方法 線程也需要受保護(hù)func (c *Counter) Count() uint64 {
    c.mu.Lock()
    defer c.mu.Unlock()
    return c.count}func main() {
    // 定義一個(gè)計(jì)數(shù)器
    var counter Counter    var wg sync.WaitGroup
    wg.Add(100)

    for i := 0; i < 100; i++ {
        go func() {
            defer wg.Done()
            for j := 0; j < 1000; j++ {
                counter.Incr()
            }
        }()
    }
    wg.Wait()

    fmt.Printf("%d\\n", counter.Count())}
思考問(wèn)題

Q:你已經(jīng)知道,如果 Mutex 已經(jīng)被一個(gè) goroutine 獲取了鎖,其它等待中的 goroutine 們只能一直等待。那么,等這個(gè)鎖釋放后,等待中的 goroutine 中哪一個(gè)會(huì)優(yōu)先獲取 Mutex 呢?

A:FIFO,先來(lái)先服務(wù)的策略,Go 的 goroutine 調(diào)度中,會(huì)維護(hù)一個(gè)保障 goroutine 運(yùn)行的隊(duì)列,當(dāng)獲取到鎖的 goroutine 執(zhí)行完臨界區(qū)的操作的時(shí)候,就會(huì)釋放鎖,在隊(duì)列中排在第一位置的 goroutine 會(huì)拿到鎖進(jìn)行臨界區(qū)的操作。


新聞名稱(chēng):關(guān)于Go并發(fā)編程之Mutex
當(dāng)前路徑:http://www.dlmjj.cn/article/cjisec.html