使用goroutine和channel可以非常簡單的解決一讀一寫多著多讀一寫的執行緒協作問題,而且乙個goroutine只負責寫,或者讀,不可能又寫又讀。
不過還是會不免要遇到多個goroutine同時要讀寫的問題。
常舉的乙個例子就是銀行賬戶的訪問問題,在這個問題模型中,多個goroutine會同時出現寫操作,最常見的bug就是使用者ab同時進入讀取塊,都發現還剩下100元,此時如果他們同時取錢,賬戶就會變成-100元
一種常見的解決方法就是再開乙個執行緒,只要有多於乙個執行緒同時訪問某變數,都可以再開乙個執行緒,然後把訪問委託給他,此時訪問變數的就只有乙個執行緒了。
使用go的select,就可以非常優雅的解決這個問題
package bank
var deposits = make(chan
int) // 訪問錢的請求佇列
var balances = make(chan
int) //讀取錢的請求佇列
//每次呼叫方法時,只是將請求放在佇列中
func deposit(amount int)
func balance() int
func teller()
}}func init()
還有乙個解決辦法就是使用二元訊號量來保證同一時間只有goroutine在訪問共享變數,和上面的不同點主要是不用新開執行緒,而是在訪問時將另一條執行緒掛起。
import
"sync"
var (
mu sync.mutex // guards balance
balance int
)func deposit(amount int)
func balance() int
歡迎關注我的github go語言學習筆記 4 變數
宣告 var變數名 型別 1 變數宣告關鍵字 2 變數宣告不用分號做結束符 3 多個變數的宣告 1 不同型別 var i int str string 2 同一型別,只要在最後加上型別即可 var v1,v2,v3 int 初始化 宣告的同時進行初始化 var可有可無,型別可有可無 有型別名 必須有...
Go語言學習筆記 變數
變數 使用關鍵字var定義變數,格式為 var 變數名 資料型別 值 對於未初始化的變數,編譯器會自動初始化。go語言支援推斷賦值,即如果給變數提供初始化值,可以省略變數型別。由編譯器自行推斷 go語言支援組賦值 var name string wangyijie 組宣告,賦值 var name w...
Go語言學習筆記 變數
初始化變數 多個變數賦值 匿名變數 常量型別別名與型別定義 參考資料 標準格式 var 變數名 變數型別 整型變數 var a int 64位浮點陣列變數 var b float64 引數為空,返回值是bool的函式變數 var c func bool 結構體變數 var e struct 一次宣告...