gpt4 book ai didi

用于高并发情况的Java有界非阻塞缓冲区

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:40:37 28 4
gpt4 key购买 nike

基本上我需要一个数据结构来存储服务器端的临时聊天消息。应该是:

  • 有界:因为我不需要存储太多消息,客户端会每秒发送一次获取新消息的请求。我认为绑定(bind)大小应该是最大值。一秒钟内并发请求的数量。当缓冲区已满时,旧消息将被删除。

  • 适合高并发访问:我不想使用Collections.synchronizedXXXX这样的数据结构,因为在迭代过程中,如果其他线程改变了数据结构,例如添加一条消息,它会抛出一个异常,所以我必须锁定整个数据结构,实际上我并不关心客户端请求是否可以获得最后插入的消息,因为他们会在一秒钟后发送一个新请求,另一方面,写操作应该永远不会延迟。包 java.util.concurrency 下的类似乎是解决方案,但是......

  • 非阻塞:LinkedBlockingQueue, ArrayBlockingQueue 它们可以有界并且不会在迭代过程中抛出异常,但它们都是阻塞队列。当队列已满时,我想将新元素添加到尾部并从头部移除旧元素,而不是阻塞在那里等待有人移除头部。

所以我的问题是第 3 个库有什么好的实现吗?例如谷歌 Guava ?或者,也许您对在服务器上存储临时聊天消息有更好的想法?

非常感谢!

最佳答案

您可以使用 LinkedBlockingQueue使用非阻塞方法 offer(或 add)和 poll 来访问它。您可以使用固定容量创建它以使其有界。

LinkedBlockingQueue<String> myStrings = new LinkedBlockingQueue<String>(100);
myStrings.offer("Hi!"); // returns false if limit is reached
myStrings.add("Hi, again!"); // throws exception if limit is reached
String s = myStrings.poll(); // returns null if queue is empty

关于用于高并发情况的Java有界非阻塞缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10130847/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com