在Go語(yǔ)言中,實(shí)現(xiàn)并發(fā)安全主要依賴(lài)于以下幾個(gè)方面:
sync/atomic
包中的AddInt32
, AddInt64
, CompareAndSwapInt32
等。這些函數(shù)可以在多個(gè)goroutine之間安全地執(zhí)行加法、減法等操作,而無(wú)需使用鎖。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)
}
sync.Mutex
和sync.RWMutex
兩種互斥鎖,用于在多個(gè)goroutine之間同步訪問(wèn)共享資源?;コ怄i可以確保同一時(shí)間只有一個(gè)goroutine訪問(wèn)共享資源,從而避免并發(fā)安全問(wèn)題。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
是一種讀寫(xiě)鎖,允許多個(gè)goroutine同時(shí)讀取共享資源,但在寫(xiě)入時(shí)會(huì)阻止其他goroutine訪問(wèn)。這在讀操作遠(yuǎn)多于寫(xiě)操作的場(chǎng)景下可以提高性能。import (
"fmt"
"sync"
)
var data map[string]int
var rwLock sync.RWMutex
func main() {
data = make(map[string]int)
wg := sync.WaitGroup{}
// 寫(xiě)入數(shù)據(jù)
for i := 0; i < 10; i++ {
wg.Add(1)
go func(i int) {
defer wg.Done()
key := fmt.Sprintf("key%d", i)
value := i * 2
rwLock.Lock()
data[key] = value
rwLock.Unlock()
}(i)
}
// 讀取數(shù)據(jù)
for i := 0; i < 10; i++ {
wg.Add(1)
go func(i int) {
defer wg.Done()
key := fmt.Sprintf("key%d", i)
rwLock.RLock()
value := data[key]
rwLock.RUnlock()
fmt.Printf("Key: %s, Value: %d\n", key, value)
}(i)
}
wg.Wait()
}
import (
"fmt"
"sync"
)
func main() {
var wg sync.WaitGroup
ch := make(chan int, 10)
// 生產(chǎn)者
for i := 0; i < 10; i++ {
wg.Add(1)
go func(i int) {
defer wg.Done()
ch <- i * 2
}(i)
}
// 消費(fèi)者
for i := 0; i < 10; i++ {
wg.Add(1)
go func() {
defer wg.Done()
value := <-ch
fmt.Println("Value:", value)
}()
}
wg.Wait()
}
sync.WaitGroup
, sync.Once
, sync.Cond
等,用于在多個(gè)goroutine之間協(xié)調(diào)執(zhí)行。總之,Go語(yǔ)言通過(guò)原子操作、互斥鎖、讀寫(xiě)鎖、通道和同步原語(yǔ)等多種方式實(shí)現(xiàn)了并發(fā)安全。在實(shí)際開(kāi)發(fā)中,可以根據(jù)具體場(chǎng)景選擇合適的并發(fā)安全策略。