我确信对此的正确答案取决于池对象的类型和工作负载,所以我将稍微详细说明我的实现:
我有一个 ObjectPool 用于汇集长时间运行的命令行进程。这些进程通过标准输入/标准输出进行通信,并执行文件/网络操作。许多任务比其他任务完成得快得多,并且可以快速将进程返回到池中。对池的所有访问都必须是线程安全的。
我的问题是,我最好是使用 LIFO/Stack 还是 FIFO/ConcurrentLinkedQueue 来管理池?我对双方的推理:
- 堆栈保持“热”对象在运行,其中资源可能保持缓存等。更长的时间。
- FIFO 在进程之间更均衡地平衡调用,每个进程做的工作更少。谢谢!
最佳答案
我的第一个想法是:对其进行基准测试!你的两个论点似乎都有道理。您应该实现这两种策略并测试其中哪一种策略会产生更高的吞吐量。
你在问题中描述的问题类似于操作系统必须面对的进程调度。因此,利用优先级也许会有用。使用 PriorityQueue并为您的任务分配不同的优先级,这些优先级可能会随时间动态变化,例如 Aging .
最后但同样重要的是,正如评论中已经指出的那样,您可以同时尝试 ConcurrentLinkDeque并让一些获取前面的对象和一些后面的对象。在这里,我的建议也是尝试并衡量哪种平衡效果最好。
关于java - ObjectPool 的堆栈或链表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10522956/