MST
星途 面试题库

面试题:Go通道在并发安全数据结构中的应用

假设你要设计一个并发安全的队列数据结构,使用Go通道来实现。要求该队列支持多个协程安全地入队和出队操作,同时要考虑性能优化,如避免不必要的锁竞争。请详细阐述设计思路并给出核心代码实现。
13.6万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 使用Go通道:Go语言中的通道(channel)本身就是并发安全的,非常适合用来实现并发安全的队列。
  2. 性能优化:避免锁竞争的关键在于充分利用通道的特性,因为通道在内部已经实现了同步机制,无需额外的锁。

核心代码实现

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 {}
}