2013-03-11 34 views
1

假设我有四个类:Party,Creature,Job,Item。Java并发编程 - 同步阵列

缔约方具有生物
缔约方有项目
生物有工作(线程)
职位要求的项目

我无法确定如何将单个项目,同步使得没有工作可以在访问某个项目同一时间。我在形式

ArrayList<ItemInstance> 

其中ItemInstance有一个项目,一个整数,表示数量组装在党获得所有项目的列表。我不知道如何执行此列表上的锁

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

我想过这样做,但锁定resourceLock将锁定所有的项目,是否正确?另外我需要锁定特定数量的物品。所以我的数组条目可能是

(Swords, 4) 

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

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

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

这些生物中有多少是哲学家? :)也许你最好用一个任务管理员来分配工作和物品给生物? – flup 2013-03-11 22:20:21

+1

有几种锁定对象组的方法。但在我们去那里之前,我有一个问题:你想通过锁定实现什么目标? – 2013-03-11 22:23:19

+0

@SlavaImeshev“这样任何作业都不能同时访问一个项目”如果我有3个瓶子,任务使用2个,我只需要1个瓶子。 – 2013-03-12 13:08:27

回答

1

你应该列出你想要执行的并发操作(你的类的方法)。概述它们的依赖关系和不变式,因此您知道可以同时完成什么以及必须进行序列化(同步)​​。将作业定义为大多数独立任务,以最小的阻塞实现最大并发性。 采取什么java.util.concurrent具有良好的外观,提供,特别是较高级别的类,如Semaphore

很抱歉,如果这听起来过于广泛和普遍。

0

首先,正如其他人所指出的那样,您需要更清楚一些,并且/或者分析一下您正在尝试做什么。第二,一个“易于编程者”的方法是使用CopyOnWriteArrayList来处理任何“棘手”的事情。它在速度方面可能不是最高效的,但是,它对于你的应用来说可能足够快。至少给它一些想法。