最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go?為什么不支持可重入鎖原理解析

 更新時間:2023年08月07日 09:02:49   作者:煎魚  
這篇文章主要為大家介紹了Go?為什么不支持可重入鎖原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

引言

程序里的鎖,是很多小伙伴在寫分布式應用時用的最多的一個利器之一。

使用 Go 的同學里,絕大部分都有其他語言的經(jīng)驗,就會對其中一點有疑惑,那就是 Go 里的鎖,竟然不支持可重入

為此,今天煎魚帶大家一起來了解這里的設計考量,看看為什么。

可重入鎖

如果對已經(jīng)上鎖的普通互斥鎖進行 “加鎖” 操作,其結(jié)果要么失敗,要么會阻塞至解鎖。

鎖的場景如下:

  • 在加鎖上:如果是可重入互斥鎖,當前嘗試加鎖的線程如果就是持有該鎖的線程時,加鎖操作就會成功。
  • 在解鎖上:可重入互斥鎖一般都會記錄被加鎖的次數(shù),只有執(zhí)行相同次數(shù)的解鎖操作才會真正解鎖。

簡單來講,可重入互斥鎖是互斥鎖的一種,同一線程對其多次加鎖不會產(chǎn)生死鎖,又或是導致阻塞。

不同語言間實現(xiàn)可能或多或少有些區(qū)別,但大體意思差不多。

請你想一下,Go 是怎么樣的呢?

Go 支持情況

我們看到以下這個 Go 互斥鎖例子:

var mu sync.Mutex
func main() {
    mu.Lock()
    mu.Lock()
}

這段 Go 程序會阻塞嗎?不會,會報以下錯誤:

fatal error: all goroutines are asleep - deadlock!

Go 顯然是不支持可重入互斥鎖的。

官方回復

Go 設計原則

在工程中使用互斥的根本原因是:為了保護不變量,也可以用于保護內(nèi)、外部的不變量。

基于此,Go 在互斥鎖設計上會遵守這幾個原則。如下:

  • 在調(diào)用 mutex.Lock 方法時,要保證這些變量的不變性保持,不會在后續(xù)的過程中被破壞。
  • 在調(diào)用 mu.Unlock 方法時,要保證:

    • 程序不再需要依賴那些不變量。
    • 如果程序在互斥鎖加鎖期間破壞了它們,則需要確保已經(jīng)恢復了它們。

不支持的原因

講了 Go 自己的設計原則后,那為什么不支持可重入呢?

其實 Russ Cox 于 2010 年在《Experimenting with GO》就給出了答復,認為遞歸(又稱:重入)互斥是個壞主意,這個設計并不好。

我們可以結(jié)合官方的例子來理解。

如下:

func F() {
        mu.Lock()
        ... do some stuff ...
        G()
        ... do some more stuff ...
        mu.Unlock()
}
func G() {
        mu.Lock()
        ... do some stuff ...
        mu.Unlock()
}

在上述代碼中,我們在 F 方法中調(diào)用 mu.Lock 方法加上了鎖。如果支持可重入鎖,接著就會進入到 G 方法中。

此時就會有一個致命的問題,你不知道 F 和 G 方法加鎖后是不是做了什么事情,從而導致破壞了不變量,畢竟隨手起幾個協(xié)程做點壞事,也是完全可能的。

這對于 Go 是無法接受的,可重入的設計違反了前面所提到的設計理念,也就是:“要保證這些變量的不變性保持,不會在后續(xù)的過程中被破壞”。

基于上述原因,Go 官方團隊選擇了沒有支持該項特性。

總結(jié)

Go 互斥鎖沒有支持可重入鎖的設計,也是喜歡的大道至簡的思路了,可能的干擾比較多,不如直接簡單的來。

以上就是Go 為什么不支持可重入鎖原理解析的詳細內(nèi)容,更多關(guān)于Go不支持可重入鎖的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Go語言如何實現(xiàn)Benchmark函數(shù)

    Go語言如何實現(xiàn)Benchmark函數(shù)

    go想要在main函數(shù)中測試benchmark會麻煩一些,所以這篇文章主要為大家介紹了如何實現(xiàn)了一個簡單的且沒有開銷的benchmark函數(shù),希望對大家有所幫助
    2024-12-12
  • Golang中的內(nèi)存泄漏你真的理解了嗎

    Golang中的內(nèi)存泄漏你真的理解了嗎

    內(nèi)存泄漏是編程中常見的問題,會對程序的性能和穩(wěn)定性產(chǎn)生嚴重影響,本文將深入詳解?Golang?中的內(nèi)存泄漏的原因、檢測方法以及避免方法,希望對大家有所幫助
    2023-12-12
  • go語言字符串的拼接和切片方法總結(jié)

    go語言字符串的拼接和切片方法總結(jié)

    在go語言中,因為字符串只能被訪問,不能被修改,所以進行字符串拼接的時候,golang都需要進行內(nèi)存拷貝,造成一定的性能消耗,這篇文章主要給大家介紹了關(guān)于go語言字符串的拼接和切片的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • Go錯誤處理之panic函數(shù)和recover函數(shù)使用及捕獲異常方法

    Go錯誤處理之panic函數(shù)和recover函數(shù)使用及捕獲異常方法

    這篇文章主要介紹了Go錯誤處理之panic函數(shù)使用及捕獲,本篇探討了如何使用 panic 和 recover 來處理 Go 語言中的異常,需要的朋友可以參考下
    2023-03-03
  • GoLand安裝與環(huán)境配置的完整步驟

    GoLand安裝與環(huán)境配置的完整步驟

    作為一個go語言程序員,覺得自己有義務為go新手開一條更簡單便捷的上手之路,下面這篇文章主要給大家介紹了關(guān)于GoLand安裝與環(huán)境配置的完整步驟,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2022-12-12
  • go內(nèi)存緩存BigCache之Entry封裝源碼閱讀

    go內(nèi)存緩存BigCache之Entry封裝源碼閱讀

    這篇文章主要介紹了go內(nèi)存緩存BigCache之Entry封裝源碼閱讀
    2023-09-09
  • Golang WaitGroup實現(xiàn)原理解析

    Golang WaitGroup實現(xiàn)原理解析

    WaitGroup是Golang并發(fā)的兩種方式之一,一個是Channel,另一個是WaitGroup,下面這篇文章主要給大家介紹了關(guān)于golang基礎之waitgroup用法以及使用要點的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • Golang中關(guān)于defer的盲區(qū)梳理

    Golang中關(guān)于defer的盲區(qū)梳理

    關(guān)于Go中的defer,是做什么的?執(zhí)行順序是怎么樣的?相信學過Go語言的同學,已經(jīng)不在陌生,今天就來講講其中需要掌握的幾個知識點,希望對大家有所幫助
    2023-03-03
  • go使用SQLX操作MySQL數(shù)據(jù)庫的教程詳解

    go使用SQLX操作MySQL數(shù)據(jù)庫的教程詳解

    sqlx 是 Go 語言中一個流行的操作數(shù)據(jù)庫的第三方包,它提供了對 Go 標準庫 database/sql 的擴展,簡化了操作數(shù)據(jù)庫的步驟,下面我們就來學習一下go如何使用SQLX實現(xiàn)MySQL數(shù)據(jù)庫的一些基本操作吧
    2023-11-11
  • Goland激活碼破解永久版及安裝詳細教程(親測可以)

    Goland激活碼破解永久版及安裝詳細教程(親測可以)

    這篇文章主要介紹了Goland激活碼破解永久版及安裝詳細教程(親測可以),本文通過實例圖文相結(jié)合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10

最新評論

裕民县| 邛崃市| 盱眙县| 罗定市| 黑山县| 偃师市| 垫江县| 城口县| 张掖市| 浦城县| 甘洛县| 红河县| 康马县| 德江县| 东山县| 丰台区| 和林格尔县| 无棣县| 桃源县| 漯河市| 万载县| 北流市| 岑溪市| 大埔县| 高密市| 长海县| 青海省| 五家渠市| 麻阳| 泾川县| 柳江县| 无棣县| 滦平县| 通海县| 梅河口市| 永春县| 石景山区| 治县。| 原平市| 甘谷县| 张家港市|