網上介紹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...