Java并发编程 - 同步数组

时间:2013-03-11 22:12:01

标签: java multithreading concurrency

假设我有四个课程:派对,生物,工作,项目。

缔约方拥有生物 缔约方有项目
生物有工作(线程)
工作需要项目

我无法确定如何同步各个项目,因此任何作业都无法同时访问某个项目。我以

的形式汇总了聚会中所有可用项目的清单
ArrayList<ItemInstance>

其中ItemInstance有一个Item和一个表示数量的整数。我不知道如何在这个列表上执行锁定

ReentrantLock resourceLock = new ReentrantLock();
ArrayList<Condition> resourceConditions = new ArrayList<Condition>();

我想过这样做,但是锁定resourceLock会锁定所有的项目,对吗?此外,我还需要锁定特定数量的物品。所以我的数组条目可能是

(Swords, 4)

在我的主列表中,但我可能只需要使用3把剑作为我的工作。我应该将它们全部存储在一个列中并删除数量吗?

一般概念是我有一个包含所有项目和数量的大型聚会清单,然后我有很多工作,需要很少的项目和数量列表。我正在尝试使我的作业线程等待每个项目的足够,执行,然后释放要重用的项目。

PartyList = 
(Swords, 7)
(Forks, 2)
(Bottles, 5)

JobEatList = 
(Forks, 1)
//RUN THREAD

PartyList = 
(Swords, 7)
(Forks, 1)
(Bottles, 5)

JobDineList = 
(Bottles, 2)
(Forks, 4)
//WAIT

2 个答案:

答案 0 :(得分:1)

您应该列出要执行的并发操作(类的方法)。概述它们的依赖关系和不变量,以便您知道可以同时执行什么以及必须序列化(同步)​​的内容。将作业定义为大多数独立任务,以最小的阻塞实现最大并发性。 仔细看看java.util.concurrent提供的内容,尤其是Semaphore等更高级别的课程。

很抱歉,如果这听起来过于宽泛和一般。

答案 1 :(得分:0)

首先,正如其他一些人所指出的,你需要更清楚一点,和/或分析你想要做的事情。

其次,一个“程序员易于使用”的方法是使用CopyOnWriteArrayList来解决任何“棘手”问题。它在速度方面可能不是最有效的,但是,对于您的应用来说,它可能足够快。至少要考虑一下。