在Golang中,可以使用goroutine和channel來實現多線程共享變量。
使用goroutine和channel:
示例代碼如下:
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個處理結果。
使用sync包中的互斥鎖:
示例代碼如下:
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,還是使用互斥鎖,都可以實現多線程共享變量。具體使用哪種方式取決于具體的業務場景和需求。