go中鎖的作用範圍

2021-10-21 21:01:02 字數 2187 閱讀 1014

網上介紹sync.mutex的文章已經很多了,這裡也不深提。

具體就兩種,乙個互斥鎖sync.mutex;乙個讀寫鎖sync.rwmutex。

兩種鎖都有兩個方法:lock()和unlock()。

互斥鎖就是,其他執行緒不能讀也不能寫;

讀寫鎖就是,其他執行緒可以讀但是不能寫。

但是由於網上的例子大多形式為:

var(

mtx sync.rwmutex

a int

或者為:

type a struct()

//睡眠2s後更改一下a的值

time.sleep(2 * time.second)

a = 514

wg.wait()

}輸出為:

[root@vm10-0-0-63 gopath]# go run a.go 

[1]-->:  114

[2]-->:  514

疑問:「誒我不是加了鎖了麼,為什麼a的值還會變?」

然後發現,噢,加了鎖後不是說中間的內容不能變,鎖也沒那麼智慧型會去分析你加鎖後到底修改了哪些東西。

鎖就只能保證,如果某個鎖加鎖了,那麼別的地方再碰到這個鎖就會阻塞,沒碰到,那該幹什麼還幹什麼。

上面的例子在主線程中加鎖後,變成如下**:

package main

import (

"fmt"

"time"

"sync"

)func main()()

//睡眠2s後更改一下a的值

time.sleep(2 * time.second)

mtx1.lock()//加個鎖

a = 514

mtx1.unlock()//解鎖

fmt.println("[3]-->: ",a)

wg.wait()

}

輸出為:

[root@vm10-0-0-63 gopath]# go run a.go 

[1]-->:  114

[2]-->:  114

[3]-->:  514

這樣就達成了想要達成的目的,主線程想要修改a的值,但是碰到了鎖,就只能阻塞住。

所以雖然主線程是睡眠2s後想修改a為514,但實際上需要等待分執行緒睡眠5s,解鎖後才能修改值,所以在分執行緒中的[2]仍然為114,最後輸出的[3]才為514。

再舉個例子:

依然是上面的例子,稍微修改一下:

package main

import (

"fmt"

"time"

"sync"

)func main()()

//睡眠2s後更改一下a的值

time.sleep(2 * time.second)

mtx2.lock()//加個鎖

a = 514

mtx2.unlock()//解鎖

fmt.println("[3]-->: ",a)

wg.wait()

}

修改的地方很簡單,主線程中加的鎖為另乙個鎖。

輸出為:

[root@vm10-0-0-63 gopath]# go run a.go 

[1]-->:  114

[3]-->:  514

[2]-->:  514

不難理解,因為使用的鎖不一樣,所以主線程修改a的值不用等分線程,主線程在睡眠2s後就直接修改了值,然後輸出了[3]為514;

而分執行緒需要睡眠5s,在睡眠期間a的值已經被主線程改變了,所以輸出了[2]同樣為514。

鎖的作用範圍為,

時間上是:具體某把鎖的上鎖到開鎖這段時間;

流程上是:其他執行緒遇到具體某把鎖在上鎖時會阻塞;

變數上是:具體某把鎖只管具體某把鎖的事,上鎖期間的其他變數不歸鎖管,其他執行緒想改還是能改

1.鎖用什麼定義方式都是一樣的,無論是定義為全域性變數還是定義在結構體中。

2.鎖就是乙個很普通的資料型別,不會有智慧型的更改識別,它只能保證自己上鎖解鎖,怎麼用是程式設計師的事。

2..同一把鎖在加鎖到解鎖這段時間內,其他執行緒中使用同一把鎖進行的加鎖操作會被阻塞。

2.在一把鎖加鎖期間內的變數,其他執行緒使用另一把鎖加鎖,無意義,仍能修改值。

同步鎖的作用範圍

synchronized 解決的三種方式 1 使用synchronized 塊 2 synchronized 同步方法 3 synchronized 同步靜態 使用synchronize 塊通過指定鎖來制定作用範圍 1.以this充當鎖 是以物件作為鎖 鎖整個物件 2.以x.class 作為鎖 是以...

C 中變數的作用範圍 可見範圍

作用域為當前 塊,即 中。在 塊外部不可見。區域性靜態變數,即在 塊中宣告的靜態變數,作用域為當前 塊,超過該 塊則不可見 static int a 0 void test 2.類靜態成員變數,作用域為當前類,超出類範圍則不可見 static int a class test 3.全域性靜態變數,不...

go中defer的作用

go中defer的作用。1,在函式執行結束時,進行清理操作。比如 關閉檔案流 open a file defer file.close 解鎖乙個加鎖的資源 mu.lock defer mu.unlock 列印最終報告 printheader defer printfooter 關閉資料庫鏈結 ope...