我有一个场景,其中很多线程需要共享一个集合并且线程继续在集合中写入,相对写入很多而读取非常少,我不确定 ArrayBlockQueue 是否是要使用的正确集合。我应该实现我自己的集合还是在 Java 中开箱即用?
请帮忙。
我有一个场景,其中很多线程需要共享一个集合并且线程继续在集合中写入,相对写入很多而读取非常少,我不确定 ArrayBlockQueue 是否是要使用的正确集合。我应该实现我自己的集合还是在 Java 中开箱即用?
请帮忙。
这取决于你在寻找什么“收藏”。
ArrayBlockingQueue 顾名思义是一个阻塞队列。如果您只是想要一个集合来存储一堆数据并读取它,而不使用那些阻塞的 put/take 操作,那么 ArrayBlockingQueue 可能与同步的 ArrayList 没有什么不同。再想一想您使用该集合的目的。
Java 提供了一些无锁集合,例如 ConcurrentLinkedQueue。如果您不是在寻找 BlockingQueue,这些集合可能会为您提供更好的性能。
我建议你先阅读ArrayBlockingQueue和Disruptor的代码。如果您认为自己可以做得更好,您可能会编写自己的代码,但编写自己的代码很可能不会表现得那么好,或经过良好测试。
一般来说,遵循“单写原则”的系统可以获得更好的性能。并发集合确实支持多个写入器,但是如果您让每个线程写入它们自己的集合并且读取器遍历它们中的每一个,您可能会获得更少的争用和更好的吞吐量。