golang多线程共享变量的方法是什么

avatar
作者
猴君
阅读量:2

在Golang中,可以使用goroutine和channel来实现多线程共享变量。

  1. 使用goroutine和channel:

    • 使用goroutine创建多个线程,每个线程可以并发执行。
    • 使用channel来进行线程间的通信和数据共享,确保线程安全。
    • 通过channel发送数据到指定的goroutine,并通过channel接收来自其他goroutine的数据。

    示例代码如下:

    package main  import (     "fmt" )  func worker(id int, jobs <-chan int, results chan<- int) {     for j := range jobs {         fmt.Println("Worker", id, "started job", j)         results <- j * 2 // 将处理结果发送到results通道中     } }  func main() {     jobs := make(chan int, 100)     results := make(chan int, 100)      // 创建3个worker goroutine     for w := 1; w <= 3; w++ {         go worker(w, jobs, results)     }      // 向jobs通道中发送任务     for j := 1; j <= 9; j++ {         jobs <- j     }     close(jobs)      // 从results通道中接收处理结果     for a := 1; a <= 9; a++ {         <-results     } } 

    上述示例中,使用goroutine创建了3个worker线程,它们从jobs通道中接收任务,并将处理结果发送到results通道中。在main函数中,向jobs通道中发送9个任务,然后从results通道中接收9个处理结果。

  2. 使用sync包中的互斥锁:

    • 使用sync包中的Mutex类型来保护共享变量,确保同一时间只有一个线程可以访问共享变量。
    • 使用Lock方法锁定共享变量,在访问共享变量之前调用,使用Unlock方法解锁共享变量,在访问共享变量之后调用。

    示例代码如下:

    package main  import (     "fmt"     "sync" )  var (     counter int     wg      sync.WaitGroup     mutex   sync.Mutex )  func worker() {     defer wg.Done()     for i := 0; i < 1000; i++ {         mutex.Lock()         counter++         mutex.Unlock()     } }  func main() {     wg.Add(2)     go worker()     go worker()     wg.Wait()     fmt.Println("Counter:", counter) } 

    上述示例中,使用sync包中的Mutex类型来保护共享变量counter,确保同一时间只有一个线程可以访问counter。在每个worker函数中,使用Lock方法锁定counter,在访问counter之前调用,使用Unlock方法解锁counter,在访问counter之后调用。最后输出counter的值。

无论是使用goroutine和channel,还是使用互斥锁,都可以实现多线程共享变量。具体使用哪种方式取决于具体的业务场景和需求。

广告一刻

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