我确信正确的答案取决于池对象的类型和工作负载,因此我将详细介绍我的实现:
我有一个用于池长时间运行的命令行进程的ObjectPool。这些进程通过stdin/stdout进行通信,并执行文件/网络操作。许多任务的完成速度比其他任务快得多,并且可能很快将进程返回到池中。对池的所有访问都必须是线程安全的。
我的问题是,我最好还是用LIFO/Stack或者FIFO/ConcurrentLinkedQueue来管理池呢?我在双方的推理:
发布于 2012-07-20 00:28:46
我的第一个想法是:基准测试它!你们的两个论点似乎都是合理的。您应该实现这两种策略,并对其中哪种策略进行测试,从而获得更高的吞吐量。
您在问题中描述的问题类似于进程调度操作系统必须面对的问题。因此,也许利用优先次序是有益的。使用PriorityQueue并为您的任务分配不同的优先级,这可能随着时间的推移而动态变化,例如使用老化。
最后但并非最不重要的一点是,正如注释中已经指出的,您可以尝试两个ConcurrentLinkDeque,并让一些获取前面的对象和一些后面的对象。在这里,我的建议也是尝试和衡量哪种平衡最有效。
发布于 2012-07-20 00:36:07
这可能对性能没有什么影响。做任何最容易编码的事情,让你的代码更容易理解。当您正在处理执行文件和网络I/O的命令行进程时,这里和那里的缓存丢失不会产生任何影响.它们将以数量级的优势占据主导地位。
https://stackoverflow.com/questions/10522956
复制相似问题