Java并发编程-同步数组

Java并发编程-同步数组,java,multithreading,concurrency,Java,Multithreading,Concurrency,假设我有四个类:派对,生物,工作,物品 聚会有动物 各方都有项目 生物有作业(线程) 工作需要物品 我在确定如何同步单个项时遇到问题,因此没有作业可以同时访问某个项。我在表格中列出了聚会上所有可用物品的清单 ArrayList<ItemInstance> 在我的主列表中,但我可能只需要使用3把剑来完成我的工作。我是否应该将它们全部存储在一列中并删除数量 一般的概念是,我有一个包含所有物品和数量的大型派对清单,然后我有很多工作,其中包含所需物品和数量的小清单。我试图让我的作业线程等待

假设我有四个类:派对,生物,工作,物品

聚会有动物
各方都有项目
生物有作业(线程)
工作需要物品

我在确定如何同步单个项时遇到问题,因此没有作业可以同时访问某个项。我在表格中列出了聚会上所有可用物品的清单

ArrayList<ItemInstance>
在我的主列表中,但我可能只需要使用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

您应该列出要执行的并发操作(类的方法)。概述它们的依赖关系和不变量,这样您就知道什么可以并发完成,什么必须序列化(同步)。将作业定义为主要独立的任务,以在最小阻塞的情况下实现最大并发性。 仔细看看
java.util.concurrent
提供了什么,特别是像
Semaphore
这样的高级类


如果这听起来太宽泛,很抱歉

您应该列出要执行的并发操作(类的方法)。概述它们的依赖关系和不变量,这样您就知道什么可以并发完成,什么必须序列化(同步)。将作业定义为主要独立的任务,以在最小阻塞的情况下实现最大并发性。 仔细看看
java.util.concurrent
提供了什么,特别是像
Semaphore
这样的高级类


如果这听起来太宽泛,很抱歉

首先,正如其他一些人所指出的,您需要更清楚地了解和/或分析您正在尝试做的事情


其次,一种“程序员容易”的方法是使用
CopyOnWriteArrayList
s来处理任何“棘手”的事情。就速度而言,它可能不是最有效的,但是对于您的应用程序来说,它可能已经足够快了。至少要想一想。

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


其次,一种“程序员容易”的方法是使用
CopyOnWriteArrayList
s来处理任何“棘手”的事情。就速度而言,它可能不是最有效的,但是对于您的应用程序来说,它可能已经足够快了。至少想一想。

这些生物中有多少是哲学家?:)也许你最好找一个taskmaster线程,负责将作业和项目分配给生物?有几种方法可以锁定对象组。但在我们开始之前,我有一个问题:你想通过锁定来实现什么?@SlavaImeshev“这样任何作业都不能同时访问一个项目”如果我有3个瓶子,一个任务使用2个,我只希望有1个瓶子可用。这些生物中有多少是哲学家也许你最好找一个taskmaster线程,负责将作业和项目分配给生物?有几种方法可以锁定对象组。但在我们开始之前,我有一个问题:你想通过锁定实现什么?@SlavaImeshev“这样任何作业都不能同时访问一个项目”如果我有3个瓶子,一个任务使用2个,我只希望有1个瓶子可用。
(Swords, 4)
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