91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Go讀寫鎖操作的方法

發布時間:2022-07-06 09:59:17 來源:億速云 閱讀:162 作者:iii 欄目:開發技術

這篇“Go讀寫鎖操作的方法”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Go讀寫鎖操作的方法”文章吧。

讀寫鎖有很多方法

  • 方法一: RLock 這個方法是讀鎖,當寫鎖存在的時候,無法加載讀鎖,只有當不存在鎖,或者只有讀鎖的時候才能使用。讀鎖可以同時加載多個,適用于多度寫少的場景。

  • 方法二: RUnlock 這個方法是讀解鎖,用來撤銷單次的讀鎖操作。

  • 方法三: Lock 這個方法是寫上鎖,如果在添加寫上鎖之前已經有其他的讀鎖和寫鎖了,此時,這個Lock會被阻塞,直到可以使用。

  • 方法四: Unlock 這個方法是寫解鎖,如果沒有綁定寫鎖就直接寫解鎖,會引發運行時錯誤。

讀操作

下面用實際的代碼做例子,看一下讀操作:

package main
import (
    "fmt"
    "sync"
    "time"
)
//新建一個鎖對象的指針,然后待會兒再指針中創建這個鎖的對象
var rwMutex *sync.RWMutex
//為了保證 子的goroutine先執行,可以使用同步等待組wg,這里創建wg的指針類型
var wg *sync.WaitGroup
func main() {
    rwMutex = new(sync.RWMutex)
    wg = new(sync.WaitGroup)
    wg.Add(2)//這里記得+add
    //    在主函數中 啟動2條goroutine
    go readData(1)
    go readData(2)
    wg.Wait()
    fmt.Println("main func end")
}
func readData(i int) {
    defer wg.Done()
    fmt.Println(i, "start locking!")
    //    給讀操作 上鎖
    rwMutex.RLock()
    //    讀數據
    fmt.Println(i, "Reading data")
    //  睡一下
    time.Sleep(1 * time.Second)
    //    讀解鎖
    rwMutex.RUnlock()
    //打印提示信息
    fmt.Println(i, "Read over")
}

代碼運行結果如下:

2 start locking!
2 Reading data
1 start locking!
1 Reading data
2 Read over
1 Read over
main func end

從打印結果可知,第二條goroutine先上讀鎖,然后第二條開始讀取,然后第一條上讀鎖【從這里就可以看出,因為第二條的讀鎖還沒讀解鎖,第一條的讀鎖就上了,所以這里的讀鎖并不互斥】,之后第一條開始讀取,第二條讀解鎖,第一條讀解鎖。主goroutine結束。

寫操作

package main
import (
    "fmt"
    "sync"
    "time"
)
//新建一個鎖對象的指針,然后待會兒再指針中創建這個鎖的對象
var rwMutex *sync.RWMutex
//為了保證 子的goroutine先執行,可以使用同步等待組wg,這里創建wg的指針類型
var wg *sync.WaitGroup
func main() {
    rwMutex = new(sync.RWMutex)
    wg = new(sync.WaitGroup)
    wg.Add(4)
    //    在主函數中 啟動2條goroutine
    go readData(1)
    go readData(2)
    go writeData(3)
    go writeData(4)
    wg.Wait()
    fmt.Println("main func end")
}
func readData(i int) {
    defer wg.Done()
    fmt.Println(i, "start locking!")
    //    給讀操作 上鎖
    rwMutex.RLock()
    //    讀數據
    fmt.Println(i, "Reading data")
    //  睡一下
    time.Sleep(1 * time.Second)
    //    讀解鎖
    rwMutex.RUnlock()
    //打印提示信息
    fmt.Println(i, "Read over")
}
func writeData(i int) {
    defer wg.Done()
    fmt.Println(i, " Writing Start")
    //寫上鎖
    rwMutex.Lock()
    fmt.Println(i, "~~~ writing right now~~~")
    time.Sleep(1 * time.Second)
    rwMutex.Unlock()
    fmt.Println(i, "writing completed")
}

代碼運行結果如下:

2 start locking!
2 Reading data
4  Writing Start
1 start locking!
3  Writing Start
2 Read over
4 ~~~ writing right now~~~
4 writing completed
1 Reading data
1 Read over
3 ~~~ writing right now~~~
3 writing completed
main func end

以上就是關于“Go讀寫鎖操作的方法”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

go
AI

丽江市| 宜阳县| 特克斯县| 兴义市| 和平区| 新巴尔虎左旗| 公安县| 都昌县| 北安市| 临西县| 理塘县| 平邑县| 黄大仙区| 兴业县| 来安县| 拉孜县| 牡丹江市| 勐海县| 翁牛特旗| 金阳县| 延安市| 大名县| 福清市| 徐闻县| 安化县| 惠东县| 汝州市| 南通市| 彰武县| 福建省| 平泉县| 澜沧| 天全县| 兴业县| 新余市| 仙居县| 城市| 皋兰县| 夹江县| 建德市| 双江|