當多個goroutine
同時訪問乙個資源的時候需要加上互斥鎖防止出錯。互斥鎖能保證同時只有乙個goroutine
訪問共享資源。go語言中使用sync
包的mutex
型別詩選互斥鎖。
// go語言中對 mutex 的定義
// a mutex is a mutual exclusion lock.
// the zero value for a mutex is an unlocked mutex.
//// a mutex must not be copied after first use.
type mutex struct
package main
import (
"fmt"
"sync"
)var (
lock sync.mutex
wg sync.waitgroup
x = 0
)func add()
wg.done()
}func main()
使用互斥鎖能保證同一時間有且只有乙個goroutine
進入臨界區,其他的goroutine
則在等待鎖;當互斥鎖釋放後,等待的goroutine
才可以獲取鎖進入臨界區。多個goroutine
同時等待乙個鎖時,喚醒的策略是隨機的。互斥鎖是完全互斥的,當我們併發的去讀取乙個資源不涉及資源修改的時候是沒有必要加鎖的,讀取遠遠大於寫的時候使用讀寫鎖。讀寫鎖在go語言中使用sync
包中的rwmutex
型別。
package main
import (
"fmt"
"sync"
"time"
)var (
x int64
wg sync.waitgroup
lock sync.mutex
rwlock sync.rwmutex
)func write()
func read()
func main()
for i := 0; i < 10000; i++
wg.wait()
end := time.now()
fmt.println(end.sub(start))
}
golang之讀寫鎖,互斥鎖的理解
golang sync包裡提供了 locker介面 互斥鎖 mutex 讀寫鎖 rwmutex用於處理併發過程中可能出現同時兩個或多個協程 或執行緒 讀或寫同乙個變數的情況。在併發的情況下,多個執行緒或協程同時去修改乙個變數。使用鎖能保證在某一時間點內,只有乙個協程或執行緒修改這一變數,具體我們可以...
golang互斥鎖跟讀寫鎖
golang中sync包實現了兩種鎖mutex 互斥鎖 和rwmutex 讀寫鎖 其中rwmutex是基於mutex實現的,唯讀鎖的實現使用類似引用計數器的功能 1 互斥鎖 其中mutex為互斥鎖,lock 加鎖,unlock 解鎖,使用lock 加鎖後,便不能再次對其進行加鎖,直到利用unlock...
golang 之sync 併發安全鎖
讓乙個程式併發安全並不需要其中的每乙個具體型別都是併發安全的。實際上併發安全的型別其實是特例而不是普遍存在的,所以僅在文件指出型別是安全的情況下,才可以併發的訪問乙個變數。與之對應的是,匯出的包級別函式通常可以認為是併發安全的。因為包級別的變數無法限制在乙個goroutine內。所以那些修改這些變數...