当前位置: 首页 > 面试题库 >

是否可以将Go的缓冲通道用作线程安全队列?

吉凯捷
2023-03-14
问题内容

我想找到一个队列结构(数据容器),其元素必须是先进先出的。对我而言,重要的是该结构必须是线程安全的。我将使用此数据容器作为任务或连接池之类的东西。

我知道缓冲通道是线程安全的,但是我想知道它是否可以作为FIFO使用,特别是在并发情况下。

并且如果可以将缓冲通道用作线程安全队列,我是否需要担心其效率?


问题答案:

我很确定Channels是FIFO。它们也很便宜,因此它们将提高内存效率。除此之外,在不知道如何使用它们的细节的情况下,我们真的无法提供更多建议。



 类似资料:
  • 默认情况下,通道是不带缓冲区的。 发送端发送数据,同时必须又接收端相应的接收数据。 而带缓冲区的通道则允许发送端的数据发送和接收端的数据获取处于异步状态,就是说发送端发送的数据可以放在缓冲区里面,可以等待接收端去获取数据,而不是立刻需要接收端去获取数据。 不过由于缓冲区的大小是有限的,所以还是必须有接收端来接收数据的,否则缓冲区一满,数据发送端就无法再发送数据了。 package main imp

  • 问题内容: 从Java使用gRPC时,我可以缓存存根(客户端)并在多线程环境中调用它们吗?或者通道是线程安全的并且可以安全地缓存吗? 如果网络中断,我应该重新创建通道还是它足够智能以重新连接?我在http://www.grpc.io/docs/上找不到相关信息 谢谢 问题答案: 回答第一个问题: 通道是线程安全的;标有注释。存根也是线程安全的,这就是为什么重新配置会创建新的存根的原因。 回答第二个

  • 主要内容:创建带缓冲通道,阻塞条件Go语言中有缓冲的通道(buffered channel)是一种在被接收前能存储一个或者多个值的通道。这种类型的通道并不强制要求 goroutine 之间必须同时完成发送和接收。通道会阻塞发送和接收动作的条件也会不同。只有在通道中没有要接收的值时,接收动作才会阻塞。只有在通道没有可用缓冲区容纳被发送的值时,发送动作才会阻塞。 这导致有缓冲的通道和无缓冲的通道之间的一个很大的不同:无缓冲的通道保证进

  • Go语言中无缓冲的通道(unbuffered channel)是指在接收前没有能力保存任何值的通道。这种类型的通道要求发送 goroutine 和接收 goroutine 同时准备好,才能完成发送和接收操作。 如果两个 goroutine 没有同时准备好,通道会导致先执行发送或接收操作的 goroutine 阻塞等待。这种对通道进行发送和接收的交互行为本身就是同步的。其中任意一个操作都无法离开另一

  • 问题内容: 在Go编程语言中,线程安全吗?AFAIK,其文档未提及线程安全性。 问题答案: 没有。 Go文档遵循一个简单的规则:如果未明确声明并发访问某事是安全的,则不是。

  • 问题内容: 考虑几个并行运行的Web服务器实例。每个服务器都有对单个共享“状态保持器”的引用,该角色的作用是保留来自所有服务器的最新请求。 例如(): 在任何时间点,都可以从监视应用程序中调用“状态保持器”,该应用程序读取了最近的SLA报告请求。 在Java中实现这种生产者-消费者方案的最佳方法是什么,使Web服务器具有比SLA报告更高的优先级? CircularFifoBuffer似乎是容纳请求