欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

解析golang中的并發(fā)安全和鎖問題

 更新時間:2021年11月08日 14:42:21   作者:專職  
本文我們來學習一下golang中的并發(fā)安全和鎖問題,文章通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧

1. 并發(fā)安全

package main
 
import (
    "fmt"
    "sync"
)
 
var (
    sum int
    wg sync.WaitGroup
)
 
func test() {
    for i := 0; i < 5000000; i++ {
        sum += 1
    }
    wg.Done()
}
 
func main() {
    // 并發(fā)和安全鎖
    wg.Add(2)
    go test()
    go test()
 
    wg.Wait()
    fmt.Println(sum)
 
}

  上面的代碼中我們開啟了兩個goroutine去累加變量x的值,這兩個goroutine在訪問和修改x變量的時候就會存在數(shù)據(jù)競爭,導致最后的結果與期待的不符。

2. 互斥鎖

package main
 
import (
    "fmt"
    "sync"
)
 
var (
    sum int
    wg sync.WaitGroup
    mu sync.Mutex  // 定義一個互斥鎖
)
 
func test() {
    for i := 0; i < 10000000; i++ {
        // 互斥鎖它能夠保證同時只能有一個goroutine去訪問共享資源
        mu.Lock()
        sum += 1
        mu.Unlock()
    }
    wg.Done()
}
 
func main() {
    fmt.Println(mu)
    // 并發(fā)和安全鎖
    wg.Add(2)
    go test()
    go test()
 
    wg.Wait()
    fmt.Println(sum)
 
}

  使用互斥鎖能夠保證同一時間有且只有一個goroutine進入臨界區(qū),其他的goroutine則在等待鎖;當互斥鎖釋放后,等待的goroutine才可以獲取鎖進入臨界區(qū),多個goroutine同時等待一個鎖時,喚醒的策略是隨機的。

3. 讀寫互斥鎖

互斥鎖是完全互斥的,但是有很多實際的場景下是讀多寫少的,當我們并發(fā)的去讀取一個資源不涉及資源修改的時候是沒有必要加鎖的,這種場景下使用讀寫鎖是更好的一種選擇。讀寫鎖在Go語言中使用sync包中的RWMutex類型。

讀寫鎖分為兩種:讀鎖和寫鎖。當一個goroutine獲取讀鎖之后,其他的goroutine如果是獲取讀鎖會繼續(xù)獲得鎖,如果是獲取寫鎖就會等待;當一個goroutine獲取寫鎖之后,其他的goroutine無論是獲取讀鎖還是寫鎖都會等待。

package main
 
import (
    "fmt"
    "sync"
    "time"
)
 
var (
    x int
    wg sync.WaitGroup
    mu sync.Mutex  // 定義一個互斥鎖
    rw sync.RWMutex  // 定義一個讀寫鎖,注意:只有讀多寫少的時候,讀寫鎖才能發(fā)揮其優(yōu)勢
)
 
func write() {
    rw.Lock()
    x += 1
    time.Sleep(10 * time.Millisecond)  // 假設寫入時間耗費10毫秒
    rw.Unlock()
    wg.Done()
}
func read() {
    rw.RLock()
    time.Sleep(time.Millisecond)
    rw.RUnlock()
    wg.Done()
}
 
func main() {
    start := time.Now()
    for i := 0; i < 10; i++ {
        wg.Add(1)
        go write()
    }  // 寫耗時:160毫秒左右
 
    for i := 0; i < 1000; i++ {
        wg.Add(1)
        go read()
    }  // 讀耗時:15毫秒左右
 
    wg.Wait()
    end := time.Now()
    fmt.Println("執(zhí)行時間:", end.Sub(start))
}

  需要注意的是讀寫鎖非常適合讀多寫少的場景,如果讀和寫的操作差別不大,讀寫鎖的優(yōu)勢就發(fā)揮不出來。

到此這篇關于golang中的并發(fā)安全和鎖的文章就介紹到這了,更多相關golang并發(fā)和鎖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • go?sync.Once實現(xiàn)高效單例模式詳解

    go?sync.Once實現(xiàn)高效單例模式詳解

    這篇文章主要為大家介紹了go?sync.Once實現(xiàn)高效單例模式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • go語言題解LeetCode453最小操作次數(shù)使數(shù)組元素相等

    go語言題解LeetCode453最小操作次數(shù)使數(shù)組元素相等

    這篇文章主要為大家介紹了go語言題解LeetCode453最小操作次數(shù)使數(shù)組元素相等示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • Go 第三方庫之類型轉換問題

    Go 第三方庫之類型轉換問題

    今天給大家介紹一個第三方庫,專門處理類型轉換的問題。對Go 第三方庫之類型轉換問題感興趣的朋友跟隨小編一起看看吧
    2021-08-08
  • go語言實現(xiàn)抓取高清圖片

    go語言實現(xiàn)抓取高清圖片

    本文給大家分享的是使用go語言實現(xiàn)的抓取高清美女圖片的代碼,原理非常簡單,這里就不多廢話了,主要是看到很多小伙伴使用python實現(xiàn)的,心血來潮就用go寫了下,推薦給大家。
    2015-03-03
  • go語言map字典刪除操作的方法

    go語言map字典刪除操作的方法

    這篇文章主要介紹了go語言map字典刪除操作的方法,實例分析了map字典操作的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-02-02
  • Go語言做爬蟲狀態(tài)碼返回418的問題解決

    Go語言做爬蟲狀態(tài)碼返回418的問題解決

    在使用Go語言做爬蟲時,使用http.Get(url)去獲取網(wǎng)頁內(nèi)容,狀態(tài)碼返回404,本文我們就詳細的介紹一下解決方法,感興趣的可以了解一下
    2021-12-12
  • Go REFLECT Library反射類型詳解

    Go REFLECT Library反射類型詳解

    這篇文章主要為大家介紹了Go REFLECT Library反射類型詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • Golang語言JSON解碼函數(shù)Unmarshal的使用

    Golang語言JSON解碼函數(shù)Unmarshal的使用

    本文主要介紹了Golang語言JSON解碼函數(shù)Unmarshal的使用,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • 解決Go語言數(shù)據(jù)庫中null值的問題

    解決Go語言數(shù)據(jù)庫中null值的問題

    這篇文章主要介紹了解決Go語言數(shù)據(jù)庫中null值的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Linux系統(tǒng)下Go語言開發(fā)環(huán)境搭建

    Linux系統(tǒng)下Go語言開發(fā)環(huán)境搭建

    這篇文章主要介紹了Linux系統(tǒng)下Go開發(fā)環(huán)境搭建,需要的朋友可以參考下
    2022-04-04

最新評論