Golang 锁和 sync 包
在Golang中,sync
包提供了基本的同步基元,如Mutex(互斥锁)、RWMutex(读写互斥锁)、WaitGroup(等待组)和一些其他的同步原语。
以下是一些使用Golang sync
包中的Mutex的示例:
- 使用Mutex保护共享资源:
package main
import (
"fmt"
"sync"
)
var (
counter int
wg sync.WaitGroup
mux sync.Mutex
)
func increment(wg *sync.WaitGroup, mux *sync.Mutex) {
mux.Lock()
counter++
mux.Unlock()
wg.Done()
}
func main() {
for i := 0; i < 10; i++ {
wg.Add(1)
go increment(&wg, &mux)
}
wg.Wait()
fmt.Println("Counter:", counter)
}
在这个例子中,我们创建了一个全局变量counter
和一个Mutex
。increment
函数被调用10次,每次都会对counter
进行递增操作。使用Mutex
来确保在同一时间只有一个goroutine可以修改counter
。
- 使用RWMutex提高读写性能:
package main
import (
"fmt"
"sync"
"time"
)
var (
data = make(map[int]int)
mux sync.RWMutex
)
func read(key int) int {
mux.RLock()
value := data[key]
mux.RUnlock()
return value
}
func write(key, value int) {
mux.Lock()
data[key] = value
mux.Unlock()
}
func main() {
// 写入数据
go func() {
for i := 0; i < 10; i++ {
write(i, i)
time.Sleep(time.Millisecond * 100)
}
}()
// 读取数据
for i := 0; i < 10; i++ {
fmt.Println(read(i))
time.Sleep(time.Millisecond * 100)
}
}
在这个例子中,我们使用了一个RWMutex
来控制对共享数据data
的访问。read
函数使用RLock
来获取读锁,而write
函数使用Lock
来获取写锁。这样,当有多个goroutine读取数据时,可以同时获取读锁,而写操作会阻塞所有的读操作。
以上就是Golang中使用sync
包的两个基本例子。在实际应用中,你可能需要根据具体情况选择合适的锁类型,并确保锁的正确使用和释放,以避免死锁和竞态条件等问题。
评论已关闭