- 实现思路:
- 使用
sync.Mutex
来保护对切片的操作。在添加或删除切片元素前,先获取锁,操作完成后释放锁,这样可以避免多个 goroutine 同时修改切片导致的数据竞争。
- 也可以使用
sync.RWMutex
,如果读操作较多,写操作较少,读操作时使用读锁,写操作时使用写锁,能提高并发性能。因为读操作之间不互斥,只有读操作和写操作、写操作和写操作之间互斥。
- 关键代码片段(使用
sync.Mutex
):
package main
import (
"fmt"
"sync"
)
var (
dataSlice []int
mu sync.Mutex
)
func addElement(num int) {
mu.Lock()
dataSlice = append(dataSlice, num)
mu.Unlock()
}
func removeElement(index int) {
mu.Lock()
if index < len(dataSlice) {
dataSlice = append(dataSlice[:index], dataSlice[index+1:]...)
}
mu.Unlock()
}
func main() {
var wg sync.WaitGroup
// 模拟多个 goroutine 并发操作
for i := 0; i < 5; i++ {
wg.Add(1)
go func(n int) {
defer wg.Done()
addElement(n)
}(i)
}
wg.Wait()
fmt.Println("Final slice:", dataSlice)
}
- 关键代码片段(使用
sync.RWMutex
,示例只展示添加操作,删除操作类似,加写锁):
package main
import (
"fmt"
"sync"
)
var (
dataSlice []int
rwMu sync.RWMutex
)
func addElement(num int) {
rwMu.Lock()
dataSlice = append(dataSlice, num)
rwMu.Unlock()
}
func readElement() {
rwMu.RLock()
fmt.Println("Reading slice:", dataSlice)
rwMu.RUnlock()
}
func main() {
var wg sync.WaitGroup
// 模拟多个 goroutine 并发操作
for i := 0; i < 5; i++ {
wg.Add(1)
go func(n int) {
defer wg.Done()
addElement(n)
}(i)
}
wg.Wait()
readElement()
}