0

在事件处理中,一个函数将值放入一个集合中,另一个函数从同一个集合中删除。这些项目应该按照它们从源(套接字)接收到的顺序放置在集合中,并以相同的方式读取,否则结果会改变。

队列是大多数人推荐的集合,但同时,队列在添加项目时被阻塞,因此其他功能必须等到添加完成,这使其效率低下,并且操作延迟会随着时间的推移而增加。

例如,一个线程从一个队列中读取,而另一个线程写入同一个队列。任何一个操作都在队列上一次执行,直到它释放一个锁。是否有任何数据结构可以避免这种情况。

4

2 回答 2

3

ConcurrentLinkedQueue就是其中的一个例子。请参阅其他课程java.util.concurrent

针对特定情况,还有更多高性能的第三方库,例如LMAX Disruptor

于 2016-10-15T09:13:49.620 回答
2

事实上,在许多情况下, LinkedBlockingQueue是最容易使用的,因为它的阻塞 put 和 take 方法,等待直到有一个项目要占用,或者在名为容量的上限大小限制已被激活的情况下为另一个项目插入空间。设置容量是可选的,如果没有,队列可以无限增长。

另一方面,ArrayBlockingQueue 是其中最高效和最美观的,它在内部使用环形缓冲区,因此必须具有固定容量它比 LinkedBlockingQueue 快得多,但远非破坏者所能达到的最大吞吐量 :)

在这两种情况下,阻塞在双方都是完全可选的。还支持所有并发队列的非阻塞 API。阻塞和非阻塞 API 可以混合使用。

在许多情况下,队列并不是瓶颈,而当它真的是瓶颈时,使用中断器通常是明智的做法。它不是一个队列,而是一个在具有不同角色的参与线程之间共享的环形缓冲区,即通常一个生产者、n 个工作人员和一个消费者。设置起来有点麻烦,但在现代硬件上可以实现每秒大约 1 亿次事务的速度,因为它不需要昂贵的易失性变量,而是依赖于更微妙的方式来序列化依赖于机器的读取和写入(您基本上需要编写部分汇编器中的这种东西):)

于 2016-10-15T09:39:15.540 回答