ObjectPool的Stack或LinkedList?

时间:2012-05-09 19:38:01

标签: java multithreading object-pooling

我确定对此的正确答案取决于池化对象的类型和工作量,因此我将详细介绍我的实现:

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

我的问题是,我最好用LIFO / Stack或FIFO / ConcurrentLinkedQueue管理池吗?我双方的理由是:

  • 堆栈保持“热”对象在游戏中,其中资源可以保持缓存/等。更久。
  • FIFO在进程之间更均衡地平衡调用,每个进程都做得更少。谢谢!

2 个答案:

答案 0 :(得分:3)

我的第一个想法是:基准测试!你的两个论点似乎都合情合理。您应该实施这两种策略并进行测试,这些策略会导致更高的吞吐量。

您在问题中描述的问题类似于操作系统必须面对的流程安排。因此,利用优先事项可能会有用。使用PriorityQueue并为您的任务分配不同的优先级,这些优先级可能会随着时间的推移而动态变化,例如使用Aging

最后但并非最不重要的是,正如评论中已经指出的那样,您可以尝试ConcurrentLinkDeque并让一些人获取前方对象和一些后方对象。在这里,我的建议是尝试并衡量哪种平衡最佳。

答案 1 :(得分:1)

它可能不会产生性能差异。做任何最容易编码的事情,让你的代码易于理解。当你处理执行文件和网络I / O的命令行进程时,这里和那里的缓存未命中就没有什么区别......这些将在数量级上占主导地位。