【问题标题】:Java concurrent programming - synchronizing arrayJava并发编程——同步数组
【发布时间】:2013-03-11 22:12:00
【问题描述】:

假设我有四个类别:Party、Creature、Job、Item。

派对有生物
派对有物品
生物有工作(线程)
工作需要物品

我在确定如何同步各个项目时遇到问题,这样没有工作可以同时访问一个项目。我在表格中汇总了派对中所有可用物品的清单

ArrayList<ItemInstance>

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

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

【问题讨论】:

  • 这些生物中有多少是哲学家? :) 也许你最好使用一个任务管理员线程来分配工作和物品给生物?
  • 有几种方法可以锁定对象组。但在我们去那里之前,我有一个问题:你想通过锁定来实现什么?
  • @SlavaImeshev “这样就没有工作可以同时访问一个项目”如果我有 3 个瓶子并且一个任务正在使用 2 个,我希望只有 1 个瓶子可用。

标签: java multithreading concurrency


【解决方案1】:

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

对不起,如果这听起来过于笼统和笼统。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-07
      • 2022-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多