我正在编写 Java 程序,目前正在调试的并发问题比我想要处理的要多得多。
我想问:你在设计程序时如何处理并发问题?就我而言,这是一个相对简单的游戏,但线程问题不断出现 - 任何快速修复几乎肯定会导致新问题。
笼统地说,在决定应用程序如何“流动”而不让所有线程陷入困境时,我应该使用哪些技术?
并发归结为管理共享状态。
“所有并发问题都归结为
协调对可变状态的访问。
状态的可变性越小,就越容易
是为了保证线程安全。”
-- Java 并发实践
所以你必须问自己的问题是:
- 是什么inherent我的应用程序需要的共享数据?
- 线程何时可以在snapshot数据的,也就是说,它在共享数据的克隆上瞬时工作?
- 我可以识别已知的吗pattern并使用更高级别的抽象而不是低级别的锁和线程协调,例如队列、执行器等?
- 考虑使用全局锁定方案来避免deadlock并一致获取锁
管理共享状态的最简单方法是序列化每个操作。然而,这种粗粒度的方法会导致高锁争用和较差的性能。管理并发可以看作是一种优化练习,您可以在其中尝试减少争用。所以后续的问题是:
- 最简单的方法是怎样的?
- 我可以做出哪些简单的选择来减少争用(可能使用细粒度锁定)并提高性能而不使解决方案过于复杂?
- 我什么时候会变得太细粒度,也就是说,引入的复杂性不值得性能提升?
许多减少争用的方法都依赖于某种形式权衡执行正确行为所需的内容与减少争用的可行内容之间的关系。
- 我在哪里可以放松一些约束并接受有时东西不会 100% 正确(例如计数器)?
- 我可以乐观地只在发生并发修改时处理冲突吗(例如使用时间戳和重试逻辑 - 这就是 TM 所做的)?
请注意,我从未开发过游戏,只开发过企业应用程序的服务器端部分。我可以想象,情况可能会完全不同。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)