gpt4 book ai didi

java - 并发 - 循环大型数据集并执行操作

转载 作者:行者123 更新时间:2023-11-30 06:28:30 24 4
gpt4 key购买 nike

一些背景

所以我目前正在开发一个游戏项目,我在课外加入了这个项目,并且在过去一年左右的时间里真正意识到了线程问题和并发的后果。

当时我们遇到的一个大问题是关闭服务器并保存:断开所有客户端的连接并保存它们被证明是一个问题,因为我们会遇到并发问题。虽然我们解决了这个问题,但我再次遇到了另一个可能的并发问题。

问题

我目前正在为游戏制作万圣节 Activity ,并且应该每隔一段时间就会举办一次全局 Activity ,所有在该特定时间在线的玩家都会直接在其库存中收到一份礼物。

通常情况下,我会考虑捕获当前的在线玩家集并遍历所有玩家,然后给他们一个元素,但我相信这样做会产生后果。

直接可能出现的问题

  1. 如果玩家在迭代集合时退出,我可能会遇到问题。然而,我们确实用线程安全的 HashMap 包装了跟踪玩家及其状态的结构。这是否意味着,如果我首先执行发放奖励,如果玩家尝试注销,他们将被迫留下来,直到发放所有奖励的代码执行完毕?我并没有对数据结构写入或更改任何内容,因此我担心注销会完成,并且我正在尝试将一个项目提供给已经注销的人。
  2. 如果玩家登录,他们将不会进入礼物周期的当前迭代。也许这是一件好事,因为一旦礼品处理已经开始,那些加入的人在技术上就迟到了。

我想知道是否有更好的方法来解决这个问题。也许我可以将礼物分发到一个中心位置,玩家可以稍后过来领取礼物,从而避免数百名玩家之间的巨大循环。 我们确实在约 200 个在线玩家的并发性方面遇到了问题

MVE

我不太确定在这里作为 MVE 提供什么,因为我正在谈论迭代大型数据集的概念以及与之相关的并发问题,我认为这不是很容易复制(? )。如果我错了,我会尽力提供相关代码。

最佳答案

理想情况下,不存在要求用户登录才能接收礼物的内部技术限制。但听起来你确实有这样的问题。

弱引用

如果您为了赠送礼物而收集的用户对象在用户退出时成为垃圾收集的候选者,那么您的赠送礼物 Collection 应该包含 weak references到那些用户对象。弱引用允许垃圾收集继续进行,而常规强引用将使引用的对象失去成为垃圾收集候选对象的资格。请参阅WeakReference类。

创建一个空的ListSet

List< WeakReference< User > > u = new ArrayList< User >() ;

遍历当前登录的用户。将每个用户对象包装在 WeakReference 中。对于赠送礼物,迭代第二个 List/Set,检查每个 WeakReference 以查看其引用对象是否仍然可用,如果是,则赠送礼物。如果没有,请继续下一步。

WeakReference< User > weakUser = new WeakReference<>( user );
u.add( weakUser ) ;

收集后,将该列表包装为不可变的,作为一种习惯。

List< WeakReference< User > > users = Collections.unmodifiableList( u );

实际上,每当您询问当前登录的用户时,用户管理模块都应该发出这样一个不可修改的WeakReference对象列表/集。这些用户可能随时注销,即使在组装初始列表/集合时也是如此。并且始终发出一个新实例化的新集合,这是用户管理模块内部维护的集合的副本。因此,如果构建一个新的 WeakReference 列表/集,您的赠礼代码不必执行此工作;这项工作应该已经代表它完成了。

顺便说一句……如果您在生产环境中拥有多个核心,并且想要体验一下,您可以将您的 WeakReference 对象集合提供给新的 Java 8 Streams 功能,以便自动拆分并行处理您的赠送礼物。

提示:您似乎过于担心性能,而对并发性的担心不够。

  • 创建包含在 WeakReference 中的元素集合非常快,不是问题。在内存中分配引用几乎不需要时间。
  • 相比之下,无论负载如何,并发始终是一个问题,这与您关于 200 个用户的评论相矛盾。 即使是单个用户也可能在赠送礼物期间碰巧注销。程序员通常很难理解罕见事件一直在发生的讽刺!更糟糕的是,在生产环境中,添加Murphy's Law 。并发是严酷的、反复无常的、任意的。

提示:阅读并重读这本书 Java Concurrency In Practice通过 Brian Goetz ,Oracle 的 Java 语言架构师。我正在第五次重读。

关于java - 并发 - 循环大型数据集并执行操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46611743/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com