Java 对象池的堆栈或链接列表?

Java 对象池的堆栈或链接列表?,java,multithreading,object-pooling,Java,Multithreading,Object Pooling,我确信正确的答案取决于池对象的类型和工作负载,因此我将详细介绍一下我的实现: 我有一个ObjectPool,用于汇集长期运行的命令行进程。这些进程通过stdin/stdout进行通信,并执行文件/网络操作。许多任务完成得比其他任务快得多,并且可能会很快将流程返回到池中。对池的所有访问必须是线程安全的 我的问题是,使用后进先出/堆栈或先进先出/并发链接队列管理池是否更好?我双方的理由是: 堆栈使“热”对象处于活动状态,其中资源可能会被缓存/等更长时间 FIFO在进程之间更均匀地平衡调用,每个进程

我确信正确的答案取决于池对象的类型和工作负载,因此我将详细介绍一下我的实现:

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

我的问题是,使用后进先出/堆栈或先进先出/并发链接队列管理池是否更好?我双方的理由是:

  • 堆栈使“热”对象处于活动状态,其中资源可能会被缓存/等更长时间
  • FIFO在进程之间更均匀地平衡调用,每个进程所做的工作更少。谢谢
      我的第一个想法是:基准测试它!你的两个论点似乎都是合理的。您应该实现这两种策略,并测试哪一种策略可以提高吞吐量

      您在问题中描述的问题类似于操作系统必须面对的进程调度问题。因此,利用优先权或许是有益的。使用a并为任务分配不同的优先级,这些优先级可能会随着时间的推移而动态变化,例如使用


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

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

      或者你可以使用一种方法,将两种方法的优点结合起来。因此,每个过程都是专门针对某个方面的,或者它们都可以做相同的事情?@Tudor:所有人都可以做相同的事情。任何对象都和借阅器旁边的对象一样好。@Jeffrey:在堆栈上使用它有什么好处?这样我就可以轻松地“尝试两种方法”,或者更好的并发性?A使用无等待算法,这将使它比ConcurrentLinkedQue更快。选择排队的一个原因(也许是一个糟糕的原因)。