在Go語言中,管理并發(fā)程序中的資源需要考慮以下幾個方面:
sync.Mutex
或sync.RWMutex
來實現(xiàn)互斥鎖。示例:
package main
import (
"fmt"
"sync"
)
var counter int
var lock sync.Mutex
func main() {
wg := sync.WaitGroup{}
for i := 0; i < 10; i++ {
wg.Add(1)
go func() {
defer wg.Done()
lock.Lock()
counter++
lock.Unlock()
}()
}
wg.Wait()
fmt.Println("Counter:", counter)
}
sync.RWMutex
來提高性能。讀寫鎖允許多個goroutine同時進(jìn)行讀操作,但在進(jìn)行寫操作時會阻塞其他goroutine的讀寫操作。示例:
package main
import (
"fmt"
"sync"
)
var sharedData map[string]string
var rwLock sync.RWMutex
func main() {
sharedData = make(map[string]string)
wg := sync.WaitGroup{}
// 寫入數(shù)據(jù)
wg.Add(1)
go func() {
defer wg.Done()
rwLock.Lock()
sharedData["key"] = "value"
rwLock.Unlock()
}()
// 讀取數(shù)據(jù)
wg.Add(1)
go func() {
defer wg.Done()
rwLock.RLock()
value := sharedData["key"]
rwLock.RUnlock()
fmt.Println("Value:", value)
}()
wg.Wait()
}
示例:
package main
import (
"fmt"
"sync"
)
func worker(done chan bool, wg *sync.WaitGroup) {
defer wg.Done()
// 執(zhí)行任務(wù)
}
func main() {
var wg sync.WaitGroup
done := make(chan bool)
for i := 0; i < 10; i++ {
wg.Add(1)
go worker(done, &wg)
}
wg.Wait()
close(done)
for range done {
fmt.Println("Task completed")
}
}
sync/atomic
包中的AddInt32
、CompareAndSwapInt32
等。這些函數(shù)可以在不使用互斥鎖的情況下對共享變量進(jìn)行安全的操作。示例:
package main
import (
"fmt"
"sync/atomic"
)
var counter int32
func main() {
wg := sync.WaitGroup{}
for i := 0; i < 10; i++ {
wg.Add(1)
go func() {
defer wg.Done()
atomic.AddInt32(&counter, 1)
}()
}
wg.Wait()
fmt.Println("Counter:", counter)
}
總之,在Go語言中管理并發(fā)程序中的資源需要根據(jù)具體場景選擇合適的方法,如互斥鎖、讀寫鎖、通道和原子操作等。這些方法可以幫助你確保數(shù)據(jù)的一致性和程序的穩(wěn)定性。