共享和锁定多个线程之间的固定数量资源

时间:2013-09-26 14:56:32

标签: java multithreading locking blocking

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

管理此方案的优秀Java数据结构是什么?我只能想到一种方法,即使用LinkedBlockingQueuetakeput操作分别锁定和释放资源。我只想得到并发专家的建议:

对于那些好奇的人:需要共享的资源是用于计算多变量正常CDF和时刻的non-reentrant FORTRAN library的相同副本。壮观的数字图书馆,但写在一个线程安全代码不值得担心的时代。在这种情况下,我们会制作n个库的副本,其中n = Runtime.getRuntime().availableProcessors()

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

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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.
}