租用问题

质量为本、客户为根、勇于拼搏、务实创新

< 返回租用问题列表

golang多线程共享变量怎么实现,golang是多线程还是单线程

发布时间:2023-10-25 17:53:40

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

在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语句来确保在函数返回时释放锁,避免忘记释放锁致使死锁的问题。