在开始编码之前如何处理并发[关闭]

2024-01-02

我正在编写 Java 程序,目前正在调试的并发问题比我想要处理的要多得多。

我想问:你在设计程序时如何处理并发问题?就我而言,这是一个相对简单的游戏,但线程问题不断出现 - 任何快速修复几乎肯定会导致新问题。

笼统地说,在决定应用程序如何“流动”而不让所有线程陷入困境时,我应该使用哪些技术?


并发归结为管理共享状态。

“所有并发问题都归结为 协调对可变状态的访问。 状态的可变性越小,就越容易 是为了保证线程安全。” -- Java 并发实践

所以你必须问自己的问题是:

  • 是什么inherent我的应用程序需要的共享数据?
  • 线程何时可以在snapshot数据的,也就是说,它在共享数据的克隆上瞬时工作?
  • 我可以识别已知的吗pattern并使用更高级别的抽象而不是低级别的锁和线程协调,例如队列、执行器等?
  • 考虑使用全局锁定方案来避免deadlock并一致获取锁

管理共享状态的最简单方法是序列化每个操作。然而,这种粗粒度的方法会导致高锁争用和较差的性能。管理并发可以看作是一种优化练习,您可以在其中尝试减少争用。所以后续的问题是:

  • 最简单的方法是怎样的?
  • 我可以做出哪些简单的选择来减少争用(可能使用细粒度锁定)并提高性能而不使解决方案过于复杂?
  • 我什么时候会变得太细粒度,也就是说,引入的复杂性不值得性能提升?

许多减少争用的方法都依赖于某种形式权衡执行正确行为所需的内容与减少争用的可行内容之间的关系。

  • 我在哪里可以放松一些约束并接受有时东西不会 100% 正确(例如计数器)?
  • 我可以乐观地只在发生并发修改时处理冲突吗(例如使用时间戳和重试逻辑 - 这就是 TM 所做的)?

请注意,我从未开发过游戏,只开发过企业应用程序的服务器端部分。我可以想象,情况可能会完全不同。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在开始编码之前如何处理并发[关闭] 的相关文章

随机推荐

  • Python 3 字符串索引查找是 O(1)?

    短篇故事 Python 3 unicode 字符串查找是 O 1 还是 O n 很长的故事 C char 数组中字符的索引查找是常数时间 O 1 因为我们可以确定地跳转到连续的内存位置 const char mystring abcdef
  • “git checkout ”正在将分支更改为“无分支”

    我正在 git 的一个分支上工作 当我做 git checkout
  • constexpr 中的“整数常量溢出”警告

    我正在尝试找到一个与 constexpr 兼容的哈希函数 用于在编译时对字符串进行哈希处理 字符串的数量非常少 static constexpr unsigned int Fnv1aBasis 0x811C9DC5 static const
  • 使用密钥加密和解密的简单方法[重复]

    这个问题在这里已经有答案了 我正在寻找一种简单的方法来使用固定密钥 将存储在我的配置中 加密和解密一些数据并将结果存储为字符串 base16 或十六进制 就像是 string myString hello world string myKe
  • centos 6 中gfortran编译器的安装

    我尝试安装一些编译器 我的笔记本电脑使用的是 Centos 6 我已经安装了 gcc 即 GNU C 编译器 我还需要安装 gfortran 但是当我输入时yum install gfortran 我收到消息no package gfort
  • 无法让 XPath 单击 selenium 中的弹出窗口

    我正在尝试从 SEC 中提取一些简单的 CIK 代码 如果运行下面的代码 您将收到有关 调查 的弹出消息 如果您手动执行 您将看不到它 它轰炸了我的代码 但由于它是在硒中 我无法使用 chropath 检查它以使 xpath 单击 NO 我
  • 如何使用 Java3D API 在 java 中绘制简单的 3D 点(x,y,z)?

    我正在使用 Java 技术在 netbeans 平台上制作一个桌面应用程序 我做了一些图像处理 数据库功能 图像捕获过程 但现在我想在 3D 视图中绘制图像 所以 我想首先我必须制作 tiff 16 位灰度图像的点数组 然后使用这个点数组
  • 根据环境设置 angularjs 项目中的基本 URL

    我正在开发一个使用 Yeoman 创建的 AngularJs 项目 该项目使用 Grunt 作为任务管理器 在我的 index html 中 我需要设置基本 url href属性值取决于环境 如果环境是开发我希望href简单 如果环境是生产
  • 使用 socket.io-redis 的示例

    大家好 感谢您的时间和帮助 我需要一个使用socket io redis的简单示例 请发表评论 我阅读了文档 但我不明白 谢谢你 socket io redis 文档没有提到您实际上需要运行 redis 服务器 因此您可能已经忘记了这一点
  • Magento 2 - 未找到请求的组件(“0”)。使用前必须添加实现

    嗨 Magento 专家朋友们 最近我已将 magento 1 迁移到 Magento 2 2 1 0 版本 拥有9000种产品和20000个订单 我使用 Magento 迁移工具进行迁移 到目前为止 一切都很好 除了 未找到所请求的组件
  • roxygen2 如何不运行示例文件

    我很清楚当代码直接位于 roxygen 注释中时如何让 roxygen 不运行示例 但是 某些示例可能有点冗长 或者您希望将示例编译在示例目录中 在这种情况下 example file path工作正常 但我不知道如何让 roxygen 不
  • awk 用于日期范围日期格式,如 mm/dd/yyyy hh:mm:ss

    我有这样的日志文件我正在尝试检索日期范围 07 10 2013 01 31 54 SNMP 07 10 2013 01 31 54 SNMP 07 10 2013 03 03 54 SNMP 我正在使用下面的 awk 命令 它给出了所有行
  • Apache-POI 对 Excel 中的行进行排序

    我想按字符串列之一对工作表中的行进行排序 我尝试使用 Sheet shiftRows 方法来实现这一点 但我无法做到这一点 它不会在我的方法中切换行的位置 我的代码有什么问题吗 或者也许有更好的方法按 Excel 中的任何字符串列对行进行排
  • 自动高度 div 上的 Img 高度

    https jsfiddle net ry9gyb8n https jsfiddle net ry9gyb8n 大家好 几周以来我一直在尝试解决这个问题 我有一个自动高度容器 容器中的左侧 div 是自动高度 因为它里面可以有各种不同的内容
  • 如何将数字的后3位转换为0

    如何将数字的后3位转换为0 例如 3444678 到 3444000 我可以这样做 整数 3444678 1000 1000 3444000 但除法和乘法可能代价高昂 还有其他解决办法吗 你可以尝试 n n 1000 但模运算符可能与除法一
  • NewtonSoft Json DeserializeObject 空 Guid 字段

    我正在使用 ASP NET MVC C 和 HTML CSS jQuery KnockoutJs 前端 我的 HTML 页面上有一个模式联系表单 这个想法是 如果我创建一个新的联系人 模式表单会弹出空白值 包括空白的隐藏 ID 字段 如果我
  • cakephp、jquery、.ajax()、数据类型:json

    cakephp 控制器功能是否可以在没有视图的情况下完成 我试图让我的服务器返回一个不是字符串的数据类型 而是一个数组 我的控制器功能 function test this gt layout plain task Numbers uno
  • 如何垂直对齐多个表格列

    我有多个具有以下结构的表 table tr td year td tr tr td semester td td semester td tr tr td course type td td course td td course type
  • 在运行时检查宏是否已定义

    在开发静态库的过程中 遇到了测试库函数的需要 功能检查不是问题 主要问题是测试库提供的每个宏定义 我从这样的代码开始 For non vital macro OS WORDSIZE detections if defined BXI ARC
  • 在开始编码之前如何处理并发[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在编写 Java 程序 目前正在调试的并发问题比我想要处理的要多得多 我想问 你在设计程序时如何处理并发问题 就我而言 这是一个相