go璇█ " />

扫描二维码下载沐宇APP

沐宇

微信扫码使用沐宇小程序

沐宇

Go璇█涓浣曡В鍐冲苟鍙戣祫婧愮珵浜夌殑闂

扬州沐宇科技
2023-10-09 09:08:41
go璇█

鍦℅o璇█涓紝鍙互浣跨敤浠ヤ笅鍑犵鏂规硶鏉ヨВ鍐冲苟鍙戣祫婧愮珵浜夌殑闂锛?/p>

  1. 浜掓枼閿侊紙Mutex锛夛細浣跨敤sync.Mutex绫诲瀷鏉ュ垱寤轰竴涓簰鏂ラ攣瀵硅薄锛岄€氳繃璋冪敤Lock()鍜?code>Unlock()鏂规硶鏉ヤ繚鎶や复鐣屽尯浠g爜锛岀‘淇濆悓涓€鏃堕棿鍙湁涓€涓猤oroutine鍙互璁块棶鍏变韩璧勬簮銆?/li>
package main
import (
"fmt"
"sync"
)
var counter int
var mutex sync.Mutex
func main() {
var wg sync.WaitGroup
for i := 0; i < 1000; i++ {
wg.Add(1)
go increment(&wg)
}
wg.Wait()
fmt.Println(counter)
}
func increment(wg *sync.WaitGroup) {
mutex.Lock()
counter++
mutex.Unlock()
wg.Done()
}
  1. 璇诲啓浜掓枼閿侊紙RWMutex锛夛細sync.RWMutex绫诲瀷鎻愪緵浜嗘洿鐏垫椿鐨勯攣瀹氭満鍒讹紝鍏佽澶氫釜goroutine鍚屾椂璇诲彇璧勬簮锛屼絾鍙厑璁镐竴涓猤oroutine鍐欏叆璧勬簮銆傞€氳繃璋冪敤RLock()鍜?code>RUnlock()鏂规硶鏉ヨ繘琛岃鍙栨搷浣滐紝璋冪敤Lock()鍜?code>Unlock()鏂规硶鏉ヨ繘琛屽啓鍏ユ搷浣溿€?/li>
package main
import (
"fmt"
"sync"
)
var counter int
var rwMutex sync.RWMutex
func main() {
var wg sync.WaitGroup
for i := 0; i < 1000; i++ {
wg.Add(1)
go increment(&wg)
}
wg.Wait()
fmt.Println(counter)
}
func increment(wg *sync.WaitGroup) {
rwMutex.Lock()
counter++
rwMutex.Unlock()
wg.Done()
}
  1. 鍘熷瓙鎿嶄綔锛圓tomic锛夛細浣跨敤sync/atomic鍖呮彁渚涚殑鍘熷瓙鎿嶄綔鍑芥暟鏉ユ墽琛屽鍏变韩璧勬簮鐨勬搷浣滐紝淇濊瘉鎿嶄綔鐨勫師瀛愭€с€傚父鐢ㄧ殑鍘熷瓙鎿嶄綔鍑芥暟鏈?code>AddInt32()銆?code>AddInt64()銆?code>AddUint32()銆?code>AddUint64()銆?code>CompareAndSwapInt32()銆?code>CompareAndSwapInt64()绛夈€?/li>
package main
import (
"fmt"
"sync"
"sync/atomic"
)
var counter int32
func main() {
var wg sync.WaitGroup
for i := 0; i < 1000; i++ {
wg.Add(1)
go increment(&wg)
}
wg.Wait()
fmt.Println(atomic.LoadInt32(&counter))
}
func increment(wg *sync.WaitGroup) {
atomic.AddInt32(&counter, 1)
wg.Done()
}

杩欎簺鏂规硶閮藉彲浠ユ湁鏁堝湴瑙e喅骞跺彂璧勬簮绔炰簤鐨勯棶棰橈紝鍏蜂綋閫夋嫨浣跨敤鍝鏂规硶鍙栧喅浜庡疄闄呴渶姹傚拰鍦烘櫙銆?/p>

扫码添加客服微信