假设我有四个类:党,生物,工作,物品。
派对有生物
各方都有物品
生物有作业(线程)
作业需要项目
我在确定如何同步单个项目时遇到了问题,因此没有任何作业可以同时访问某个项目。我在下面的表格中列出了聚会上所有可用的物品。
ArrayList<ItemInstance>其中ItemInstance有一个项目和一个表示数量的整数。我不知道如何执行此列表上的锁定
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发布于 2013-03-12 06:28:26
您应该列出要执行的并发操作(类的方法)。勾勒出它们的依赖关系和不变量,这样您就可以知道哪些可以并发完成,哪些必须序列化(同步)。将您的作业定义为主要独立的任务,以实现最大的并发性和最小的阻塞。仔细看看java.util.concurrent提供了什么,特别是像Semaphore等更高级的类。
如果这听起来太宽泛和笼统,很抱歉。
发布于 2013-03-12 06:36:21
首先,正如其他一些人所指出的,你需要更清楚地了解和/或分析你正在尝试做的事情。
其次,一种“对程序员来说很容易”的方法是将CopyOnWriteArrayLists用于任何“棘手”的事情。就速度而言,它可能不是最高效的,但对于您的应用程序来说,它可能已经足够快了。至少考虑一下吧。
https://stackoverflow.com/questions/15349708
复制相似问题