go 鎖的使用

互斥鎖

   由標(biāo)準(zhǔn)庫代碼包sync中的Mutex結(jié)構(gòu)體類型代表,sync.Mutex類型(確切地說,是*sync.Mutex類型)只有兩個(gè)公開方法——Lock和Unlock。顧名思義,前者被用于鎖定當(dāng)前的互斥量,而后者則被用來對當(dāng)前的互斥量進(jìn)行解鎖。

package main

import (
    "sync"
    "fmt"
    "runtime"
    "time"
)
type Accout struct {
    flag sync.Mutex         //sync.Mutex類型
    money int
}
//進(jìn)行買的操作
func (a *Accout) Buy(n int) {  //自己買的工資
    a.flag.Lock()           //鎖上
    defer a.flag.Unlock()   //在方法運(yùn)行完之后解開
    if a.money >n {
        a.Do_Prepare()
        a.money -= n
    }else {
        fmt.Println("您自己買的余額已不足!請及時(shí)充值~")
    }
}
//交易操作
func (a *Accout) Do_Prepare()  {
    fmt.Println("您的余額充足可以進(jìn)行交易")
}
//工資添加
func (a *Accout) Add_Money(m int)  {
    a.flag.Lock()           //鎖上
    defer a.flag.Unlock()   //在方法運(yùn)行完之后解開
    a.money+=m
    fmt.Println("添加money",m)
}
func main() {
    runtime.GOMAXPROCS(runtime.NumCPU())
    aa:=Accout{*new(sync.Mutex),100}
    for i:=0; i<5;i++  {
        go aa.Buy(50)
        go aa.Add_Money(20)
    }
    time.Sleep(time.Millisecond)
}

讀寫鎖

   讀寫鎖由結(jié)構(gòu)體類型sync.RWMutex代表。它可以分別針對讀操作和寫操作進(jìn)行鎖定和解鎖操作。

  • 注:

   1、多個(gè)讀之間不存在互斥關(guān)系

   2、寫操作之間都是互斥的,并且寫操作與讀操作之間也都是互斥的

讀===》

var m *sync.RWMutex  //定義m的類型為讀寫鎖。
m.RLock()  //讀鎖定
m.RUnlock() //讀解鎖

讀的時(shí)候隨便讀

package main

import (
    "sync"
    "time"
)

var m *sync.RWMutex

func main() {
    m = new(sync.RWMutex)
    
    // 多個(gè)同時(shí)讀
    go read(1)
    go read(2)

    time.Sleep(2*time.Second)
}

func read(i int) {
    println(i,"read start")

    m.RLock()
    println(i,"reading")
    time.Sleep(1*time.Second)
    m.RUnlock()    

    println(i,"read over")
}

寫===》

var m *sync.RWMutex  //定義m的類型為讀寫鎖。
m.Lock() //寫操作鎖定
m.Unlock()  //寫操作解鎖

寫的時(shí)候啥也不能做

package main

import (
    "sync"
    "time"
)

var m *sync.RWMutex

func main() {
    m = new(sync.RWMutex)
    
    // 寫的時(shí)候啥也不能干
    go write(1)
    go read(2)
    go write(3)

    time.Sleep(2*time.Second)
}

func read(i int) {
    println(i,"read start")

    m.RLock()
    println(i,"reading")
    time.Sleep(1*time.Second)
    m.RUnlock()    

    println(i,"read over")
}

func write(i int) {
    println(i,"write start")

    m.Lock()
    println(i,"writing")
    time.Sleep(1*time.Second)
    m.Unlock()

    println(i,"write over")
}

wait group

   WaitGroup在go語言中,用于線程同步,它能夠一直等到所有的goroutine執(zhí)行完成,并且阻塞主線程的執(zhí)行,直到所有的goroutine執(zhí)行完成。

  

阻塞主線程等goroutine執(zhí)行完之后再放開

定義:
wg := new(sync.WaitGroup) //定義一個(gè)WaitGroup,就是用來等待都
添加幾個(gè)協(xié)程:
wg.Add(2) //有幾個(gè)進(jìn)程需要等待就寫幾個(gè),寫多或?qū)懮俣紩?huì)報(bào)錯(cuò)喲~
運(yùn)行某個(gè)協(xié)程:
    go func() {
        wg.Done() //該進(jìn)程結(jié)束就發(fā)送結(jié)束標(biāo)志。
    }()
標(biāo)記所有協(xié)程執(zhí)行完畢
wg.Wait()  //等待所有協(xié)程結(jié)束后在執(zhí)行以下都代碼。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容