浣跨敤Golang鐨勯攣鏈哄埗瀹炵幇楂樻€ц兘骞跺彂澶勭悊
鍦℅olang涓紝閿佹満鍒朵富瑕侀€氳繃sync
鍖呮潵瀹炵幇銆?code>sync鍖呮彁渚涗簡澶氱閿佺被鍨嬶紝濡備簰鏂ラ攣锛?code>Mutex锛夈€佽鍐欓攣锛?code>RWMutex锛夌瓑銆?/p>
涓嬮潰鏄竴涓娇鐢ㄤ簰鏂ラ攣瀹炵幇楂樻€ц兘骞跺彂澶勭悊鐨勭ず渚嬶細
package main
import (
"fmt"
"sync"
"time"
)
type Data struct {
value int
lock sync.Mutex
}
func main() {
data := Data{}
var wg sync.WaitGroup
for i := 0; i < 1000; i++ {
wg.Add(1)
go func(i int) {
defer wg.Done()
data.setValue(i)
}(i)
}
wg.Wait()
fmt.Println(data.getValue())
}
func (d *Data) setValue(value int) {
d.lock.Lock()
defer d.lock.Unlock()
time.Sleep(time.Millisecond) // 妯℃嫙鑰楁椂鎿嶄綔
d.value += value
}
func (d *Data) getValue() int {
d.lock.Lock()
defer d.lock.Unlock()
return d.value
}
鍦ㄧず渚嬩腑锛?code>Data缁撴瀯浣撹〃绀哄叡浜暟鎹紝鍏朵腑鐨?code>lock瀛楁鏄竴涓簰鏂ラ攣瀵硅薄銆?code>setValue鏂规硶鍜?code>getValue鏂规硶鍒嗗埆瀵?code>value瀛楁杩涜鍐欐搷浣滃拰璇绘搷浣滐紝浣跨敤浜掓枼閿佽繘琛屼繚鎶ゃ€?/p>
鍦?code>main鍑芥暟涓紝浣跨敤WaitGroup
鏉ョ瓑寰呮墍鏈塯oroutine瀹屾垚銆傛瘡涓猤oroutine璋冪敤setValue
鏂规硶灏嗚嚜宸辩殑鍊肩疮鍔犲埌Data
鐨?code>value瀛楁涓娿€?/p>
閫氳繃浣跨敤浜掓枼閿侊紝鍙互纭繚鍦ㄥ苟鍙戞儏鍐典笅瀵瑰叡浜暟鎹殑瀹夊叏璁块棶銆?/p>
相关问答