Go语言提供了两种并发编程模型:goroutine和channel。
1、goroutine
goroutine是Go语言中的轻量级线程,它们是由Go运行时管理的,创建一个新的goroutine非常简单,只需在函数调用前加上关键字go即可。
Go
func worker() {
fmt.Println("worker")
}
func main() {
go worker() // 创建一个新的goroutine
fmt.Println("main")
}
2、channel
channel是Go语言中用于在不同goroutine之间传递数据的通道,它是一个缓冲区,可以在多个goroutine之间共享数据,创建一个channel可以使用make函数:
Go
ch := make(chan int) // 创建一个整数类型的channel
向channel发送数据可以使用<-操作符:
Go
ch <42 // 将数据42发送到channel
从channel接收数据可以使用<-操作符:
Go
value := <-ch // 从channel接收数据并将其赋值给变量value
相关问题与解答
1、如何优雅地处理并发中的竞争条件?
在多线程或多进程的环境中,很容易出现竞争条件,竞争条件是指两个或多个线程或进程同时访问同一块内存区域,导致数据不一致的现象,为了避免竞争条件的出现,我们可以使用互斥锁、信号量等同步机制来保护共享资源,在Go语言中,可以使用sync包中的Mutex和RWMutex来实现同步控制。
Go
var counter int64
var mutex sync.Mutex // 创建一个互斥锁
func incrementCounter() {
mutex.Lock() // 获取互斥锁
defer mutex.Unlock() // 释放互斥锁
counter++ // 修改共享资源的值
}