golang多线程共享变量怎么实现

avatar
作者
猴君
阅读量:0

在Go语言中,可以使用sync包中的MutexRWMutex来实现多线程之间共享变量的访问控制。

Mutex是一种互斥锁,可以使用LockUnlock方法来控制对共享变量的读写访问。在使用Lock方法之前,需要先获取锁,然后再使用Unlock方法来释放锁。

import (     "sync" )  var (     mu sync.Mutex     count int )  func main() {     go increment()     go increment()      // 等待所有goroutine执行完成     time.Sleep(time.Second)      fmt.Println("count:", count) }  func increment() {     for i := 0; i < 100000; i++ {         mu.Lock()         count++         mu.Unlock()     } } 

RWMutex是一种读写锁,支持多个goroutine同时读取共享变量,但只能有一个goroutine进行写操作。可以使用RLockRUnlock方法来获取和释放读锁,使用LockUnlock方法来获取和释放写锁。

import (     "sync" )  var (     mu sync.RWMutex     count int )  func main() {     go read()     go read()     go write()      // 等待所有goroutine执行完成     time.Sleep(time.Second)      fmt.Println("count:", count) }  func read() {     for i := 0; i < 100000; i++ {         mu.RLock()         _ = count         mu.RUnlock()     } }  func write() {     for i := 0; i < 100000; i++ {         mu.Lock()         count++         mu.Unlock()     } } 

在使用sync.Mutexsync.RWMutex时,需要注意以下几点:

  • 使用LockRLock方法获取锁时,如果锁已经被其他goroutine占用,则当前goroutine会阻塞等待锁释放。
  • 在释放锁之前,需要确保已经完成了对共享变量的读写操作,避免出现数据不一致的情况。
  • 可以使用defer语句来确保在函数返回时释放锁,避免忘记释放锁导致死锁的问题。

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!