2013-03-11 65 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來處理任何「棘手」的事情。它在速度方面可能不是最高效的,但是,它對於你的應用來說可能足夠快。至少給它一些想法。