- 使用读写锁(
sync.RWMutex
):
- 为了保证切片读写的线程安全,可使用读写锁。读操作可以并发进行,写操作则需要独占锁。
- 示例代码如下:
package main
import (
"fmt"
"sync"
)
var (
data []int
mu sync.RWMutex
)
func read(index int) int {
mu.RLock()
defer mu.RUnlock()
return data[index]
}
func write(index, value int) {
mu.Lock()
defer mu.Unlock()
data[index] = value
}
- 预分配内存:
- 为了减少内存的频繁分配与释放,在初始化切片时,根据预估的最大使用量进行内存预分配。
- 例如:
data = make([]int, 0, 1000)
- 这里预分配了能容纳1000个
int
类型元素的空间,避免在后续操作中因切片容量不足而频繁重新分配内存。
- 使用环形缓冲区(可选):
- 如果对切片的操作模式是类似循环使用的,可以考虑使用环形缓冲区。
- 环形缓冲区可以复用已有的内存空间,减少内存分配。实现一个简单的环形缓冲区如下:
type RingBuffer struct {
data []int
head int
tail int
size int
mu sync.RWMutex
}
func NewRingBuffer(capacity int) *RingBuffer {
return &RingBuffer{
data: make([]int, capacity),
size: capacity,
}
}
func (rb *RingBuffer) Write(value int) {
rb.mu.Lock()
rb.data[rb.tail] = value
rb.tail = (rb.tail + 1) % rb.size
if rb.tail == rb.head {
rb.head = (rb.head + 1) % rb.size
}
rb.mu.Unlock()
}
func (rb *RingBuffer) Read() int {
rb.mu.RLock()
value := rb.data[rb.head]
rb.head = (rb.head + 1) % rb.size
rb.mu.RUnlock()
return value
}
- 环形缓冲区适合一些数据流式处理的场景,能有效减少内存分配和提升性能。