go并发与锁
在Go语言中,并发和锁是非常重要的概念。Go语言提供了几种内置的同步原语,其中最常用的是go routines(goroutines)和channel,以及互斥锁(sync.Mutex)和读写锁(sync.RWMutex)。
以下是一些示例代码,展示了如何在Go中使用并发和锁:
- 使用互斥锁(Mutex)来同步对共享资源的访问:
package main
import (
"fmt"
"sync"
)
var (
counter int
wg sync.WaitGroup
mutex sync.Mutex
)
func increment() {
defer wg.Done()
for i := 0; i < 2; i++ {
mutex.Lock()
counter++
mutex.Unlock()
}
}
func main() {
wg.Add(2)
go increment()
go increment()
wg.Wait()
fmt.Println("Counter:", counter)
}
- 使用读写锁(RWMutex)来提高读取操作的并发性能:
package main
import (
"fmt"
"sync"
)
var (
counter int
wg sync.WaitGroup
rwMutex sync.RWMutex
)
func readCounter() int {
rwMutex.RLock()
defer rwMutex.RUnlock()
return counter
}
func increment() {
defer wg.Done()
for i := 0; i < 2; i++ {
rwMutex.Lock()
counter++
rwMutex.Unlock()
}
}
func main() {
wg.Add(1)
go increment()
wg.Wait()
fmt.Println("Counter:", readCounter())
}
- 使用channel来同步并发任务并保持数据的一致性:
package main
import (
"fmt"
"sync"
)
var (
data = make(map[int]int)
wg sync.WaitGroup
mutex sync.Mutex
)
func updateData(key, value int) {
defer wg.Done()
mutex.Lock()
data[key] = value
mutex.Unlock()
}
func main() {
wg.Add(2)
go updateData(1, 10)
go updateData(2, 20)
wg.Wait()
mutex.Lock()
fmt.Println("Data:", data)
mutex.Unlock()
}
以上代码展示了如何在Go中使用互斥锁、读写锁和channel来同步并发操作,保护共享资源不受破坏,并确保数据的一致性。
评论已关闭