我确定对此的正确答案取决于池化对象的类型和工作量,因此我将详细介绍我的实现:
我有一个ObjectPool,用于汇总长时间运行的命令行进程。这些进程通过stdin / stdout进行通信,并执行文件/网络操作。许多任务比其他任务完成得更快,并且可以快速将进程返回池中。对池的所有访问必须是线程安全的。
我的问题是,我最好用LIFO / Stack或FIFO / ConcurrentLinkedQueue管理池吗?我双方的理由是:
答案 0 :(得分:3)
我的第一个想法是:基准测试!你的两个论点似乎都合情合理。您应该实施这两种策略并进行测试,这些策略会导致更高的吞吐量。
您在问题中描述的问题类似于操作系统必须面对的流程安排。因此,利用优先事项可能会有用。使用PriorityQueue并为您的任务分配不同的优先级,这些优先级可能会随着时间的推移而动态变化,例如使用Aging。
最后但并非最不重要的是,正如评论中已经指出的那样,您可以尝试ConcurrentLinkDeque并让一些人获取前方对象和一些后方对象。在这里,我的建议是尝试并衡量哪种平衡最佳。
答案 1 :(得分:1)
它可能不会产生性能差异。做任何最容易编码的事情,让你的代码易于理解。当你处理执行文件和网络I / O的命令行进程时,这里和那里的缓存未命中就没有什么区别......这些将在数量级上占主导地位。