3

我有固定数量n的相同资源需要在n或多个线程之间共享。每当一个线程需要使用一个资源时,它可以获取任何可用的资源,为此它运行一个不确定的时间量(即使用时间不统一)然后释放它。

管理这种场景的好的 Java 数据结构是什么?我只能想到一种方法,即分别使用 aLinkedBlockingQueuetakeandput操作作为锁定和释放资源。我只是想要并发专家的建议:

对于那些好奇的人:需要共享的资源是用于计算多元正态 CDF 和矩的不可重入 FORTRAN 库的相同副本。壮观的数值库,但写在一个线程安全代码不值得担心的时代。在这种情况下,我们制作n库的副本,其中n = Runtime.getRuntime().availableProcessors().

编辑:我不想创建线程的开销来执行这个库。它已经被多个线程调用;调用线程应该能够锁定资源并继续使用它。

更新:有关动机和实施,请参阅https://stackoverflow.com/a/19039878/586086

4

2 回答 2

1

您描述的模式是资源池。当资源相当简单时,线程安全队列是处理这种情况的合理方法,尽管您也可以考虑使用pool4j 之类的池库。

于 2013-09-26T15:04:31.780 回答
0

创建一个带有固定资源列表的单例类,以及将每个资源标记为可用或不可用的关联标志,以及 2 个同步方法,例如:

synchronized Resource getResource(){
   find an unavailable resource, mark it as unavailable and return it
}

synchronized int returnResource(Resource r){
   find the matching resource on list and mark it as available.
}
于 2013-09-26T15:36:13.613 回答