查询资源数组的高效同步

时间:2012-06-04 10:36:38

标签: java synchronization

有一个N个资源列表,每个资源最多可以一次查询一个。

有几个线程需要在大致相同的时间做同样的事情:以任意顺序查询每个资源(每个线程有不同的查询),并收集响应。

如果每个线程以相同的顺序循环遍历资源,从0到N-1,那么它们可能必须等待彼此,这是无效的。

我想让线程以随机排列方式循环遍历资源,但这似乎太复杂而且效率也不高,例如,对于2个资源和2个线程,在一半的情况下,它们将选择相同的顺序和等彼此。

有没有一种简单而有效的方法来解决这个问题?

3 个答案:

答案 0 :(得分:1)

不知何故,我对此的回答是没有。您无法控制线程及其访问资源的顺序,并且最重要的是(这是整个同步点)您不知道它们将如何安排执行。即使试图让他们访问免费资源也会产生不可预测的结果,因为最后创建的线程可以先安排。

我唯一想到的就是分区。也就是说,将资源和/或线程划分为部分访问/访问。请注意,这不是一个简单的问题:正如您所说,拥有更少的线程和更少的资源会增加线程尝试访问已锁定资源的机会。

答案 1 :(得分:1)

也许你应该反思。关键是要防止资源匮乏,即尽可能减少资源处理请求的时间。通常,队列在这里很有用。

鉴于您拥有最多8个不同的资源,我会为每个资源提供自己的线程和队列。查询线程将首先将所有请求放入这些队列,然后等待,同时资源从此队列中消耗。这样,资源将被请求饱和,并且饥饿被最小化。

答案 2 :(得分:1)

在资源正在使用时从列表中删除资源,因此每个线程都会执行:

  • 从列表中删除资源
  • 处理它
  • 把它放回去

显然列表访问需要同步。这样,您将永远不会有2个线程尝试使用相同的资源。