适当的数据结构或实现类,用于保存较小但不断变化的集合

时间:2012-05-09 03:31:09

标签: java data-structures concurrency

我写了以下game server并希望提供群组功能。群组将允许将在屏幕上“附近”的玩家聚集在一起。在快速动作游戏中,这个群体将会快速变化,因为玩家将不断地进出他们的区域。

由于每个玩家都需要收听来自该组中其他玩家的事件,因此玩家将订阅该组。 这让我想到了我的问题。什么是适当的数据结构或java集合类,可以在此方案中使用它来保存组中不断变化的事件侦听器集?在我看来,一组听众的数量很少超过20,并且应该小于大多数情况下的听众数量。这是一个多线程环境。

我打算使用的是CopyOnWriteArrayList。但是,由于会有合理数量的更新(由于更改订阅)这个类是否合适?还有什么其他课程可以使用?如果您有使用数组等的任何自定义实现,请分享。

3 个答案:

答案 0 :(得分:2)

除非您每秒有数百万次更改(在您的方案中似乎不太可能),CopyOnWriteArrayList应该足以满足您的需求。如果我是你,我会用它。

IF 您发现性能问题 AND 您已对自己的应用进行了分析 AND 您已确定CopyOnWriteArrayList是瓶颈,那么你可以找到一个更好的结构。但我怀疑情况会是这样。

答案 1 :(得分:1)

根据我收集的内容,您可以选择CopyOnWriteArrayListConcurrentHashMap

的CopyOnWriteArrayList:

  1. 添加/删除操作计算成本与列表的大小成线性关系。在单次迭代(组通知)期间可能会多次发生。
  2. 具有恒定读取时间的更简单的数据结构。
  3. 的ConcurrentHashMap:

    1. 添加/删除操作是一个恒定时间操作。添加或删除订阅者不会影响正在进行的迭代,并且阻塞最小化。
    2. 需要稍长读取时间的较大数据结构。
    3. 在提高效率时可以创建自定义解决方案,但在线程安全方面可能不那么安全。我倾向于ConcurrentHashMap,但获胜者可能在很大程度上取决于你的比赛结果。

答案 2 :(得分:1)

玩家是否有整数ID?如果是这样,那么我有一个轻量级,不可变的基于数组的集合类,可能对你有意义:

这是针对游戏引擎中类似情况编写的。

但是,我还有替代方法来考虑:如果您是根据附近自动更新群组,那么您可能需要考虑根本不跟踪群组。相反,请考虑使用空间数据结构,以便在事件发生时快速搜索附近的玩家,并直接将事件发送给附近的玩家。

通常,您可以使用2D或3D网格或八叉树,其中最小分割大小设置为等于组的最大范围。然后,邻近搜索只需要检查9(2D情况)或27(3D情况)位置,以便找到所有附近的玩家。我认为在需要时进行此搜索将比保持组和监听器列表的开销更快更简单....