设计思路
- 使用Go通道:Go语言中的通道(channel)本身就是并发安全的,非常适合用来实现并发安全的队列。
- 性能优化:避免锁竞争的关键在于充分利用通道的特性,因为通道在内部已经实现了同步机制,无需额外的锁。
核心代码实现
package main
import (
"fmt"
)
// 定义队列结构体
type SafeQueue struct {
queue chan interface{}
}
// 创建新的队列
func NewSafeQueue(capacity int) *SafeQueue {
return &SafeQueue{
queue: make(chan interface{}, capacity),
}
}
// 入队操作
func (q *SafeQueue) Enqueue(item interface{}) {
q.queue <- item
}
// 出队操作
func (q *SafeQueue) Dequeue() (interface{}, bool) {
item, ok := <-q.queue
return item, ok
}
// 获取队列长度
func (q *SafeQueue) Length() int {
return len(q.queue)
}
使用示例
func main() {
q := NewSafeQueue(5)
// 启动多个协程进行入队操作
go func() {
q.Enqueue(1)
}()
go func() {
q.Enqueue(2)
}()
// 启动多个协程进行出队操作
go func() {
item, ok := q.Dequeue()
if ok {
fmt.Println("Dequeued:", item)
}
}()
go func() {
item, ok := q.Dequeue()
if ok {
fmt.Println("Dequeued:", item)
}
}()
// 防止主函数退出
select {}
}