2013-09-26 52 views
2

我有一个固定号码n需要在n或更多线程之间共享相同的资源。无论何时线程需要使用某个资源,它都可以使用任何可用的资源,为此它运行的时间不确定(即使用时间不均匀),然后释放它。在多个线程之间共享和锁定固定数量的资源

什么是良好的Java数据结构来管理这种情况?我只能想到一种办法,分别使用LinkedBlockingQueuetakeput作为锁定和释放资源。我只想从并发专家那里得到一个建议:

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

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

UPDATE:请参阅https://stackoverflow.com/a/19039878/586086的动机和实施。

+1

您可以只创建N个任务添加到一个固定大小的线程池。 –

+0

@PeterLawrey在我的情况下,我希望任务从启动它们的线程的角度同步运行。将作业传递给不同的线程会带来什么好处? –

+0

“同步”是指一个又一个?在这种情况下,你只需要一个线程。使用多线程的好处是它们可以同时执行,因此花费的时间更少。 –

回答

1

您描述的模式是resource pool。当资源非常简单时,线程安全队列是处理这种情况的合理方式,但您也可以考虑一个池库,如pool4j

+0

除线程安全队列之外的其他任何建议?特别指向任何Java并发类? –

+0

您已经确定了'BlockingQueue'接口。考虑到你有固定数量的库实例在程序的整个生命周期中不会改变,所以'ArrayBlockingQueue'可能比'LinkedBlockingQueue'好一点,但是你一直在正确的轨道上。 – chrylis

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. 
} 
+0

为什么你不使用线程安全的队列来表达你刚才建议的内容? –

相关问题