java - ObjectPool 的堆栈或链表?

标签 java multithreading object-pooling

我确信对此的正确答案取决于池对象的类型和工作负载,所以我将稍微详细说明我的实现:

我有一个 ObjectPool 用于汇集长时间运行的命令行进程。这些进程通过标准输入/标准输出进行通信,并执行文件/网络操作。许多任务比其他任务完成得快得多,并且可以快速将进程返回到池中。对池的所有访问都必须是线程安全的。

我的问题是,我最好是使用 LIFO/Stack 还是 FIFO/ConcurrentLinkedQueue 来管理池?我对双方的推理:

  • 堆栈保持“热”对象在运行,其中资源可能保持缓存等。更长的时间。
  • FIFO 在进程之间更均衡地平衡调用,每个进程做的工作更少。谢谢!

最佳答案

我的第一个想法是:对其进行基准测试!你的两个论点似乎都有道理。您应该实现这两种策略并测试其中哪一种策略会产生更高的吞吐量。

你在问题​​中描述的问题类似于操作系统必须面对的进程调度。因此,利用优先级也许会有用。使用 PriorityQueue并为您的任务分配不同的优先级,这些优先级可能会随时间动态变化,例如 Aging .

最后但同样重要的是,正如评论中已经指出的那样,您可以同时尝试 ConcurrentLinkDeque并让一些获取前面的对象和一些后面的对象。在这里,我的建议也是尝试并衡量哪种平衡效果最好。

关于java - ObjectPool 的堆栈或链表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10522956/

相关文章:

python - 带有线程的Python计时器

c - 消息队列。消息发送 : Invalid argument

Android在Andengine中为不同类型的实体实现对象池

java - 将具有响应式设计的网站转换为 Android 应用程序

java - JGit check out 之前的提交

java - Raspberry Pi 上 Java 的线程性能问题

c++ - 在快速删除方面,C++ vector 有什么替代方案?

java - 将位图转换为 1 位位图

java - 我的第一个 hibernate 程序出错

java - Spring - 从对象池请求作用域 bean