在开始编码之前如何处理并发性 [已关闭]
2022-09-03 02:11:57
我正在编写Java程序的中途,我正处于调试比我想要处理的更多的并发问题的阶段。
我不得不问:在制定程序时,你如何处理并发问题?就我而言,这是一个相对简单的游戏,但线程问题不断出现 - 任何快速修复几乎肯定会导致一个新问题。
用非常笼统的术语来说,在决定我的应用程序应该如何“流动”而不让我的所有线程都打结时,我应该使用什么技术?
我正在编写Java程序的中途,我正处于调试比我想要处理的更多的并发问题的阶段。
我不得不问:在制定程序时,你如何处理并发问题?就我而言,这是一个相对简单的游戏,但线程问题不断出现 - 任何快速修复几乎肯定会导致一个新问题。
用非常笼统的术语来说,在决定我的应用程序应该如何“流动”而不让我的所有线程都打结时,我应该使用什么技术?
并发性归结为管理共享状态。
“所有并发问题都归结为协调对可变状态的访问。可变状态越少,就越容易确保线程安全。
因此,您必须问自己的问题是:
管理共享状态的最简单方法是序列化每个操作。然而,这种粗粒度的方法会导致高锁争用和性能差。管理并发性可以看作是一种优化练习,您可以在其中尝试减少争用。所以后续的问题是:
许多减少争用的方法都依赖于某种形式的权衡,即强制实施正确行为所必需的内容与减少争用的可行方法。
请注意,我从未开发过游戏,只在企业应用程序的服务器端部分工作过。我可以想象它可以是完全不同的。
我尽可能多地使用不可变的数据结构。我唯一一次使用可变结构是当我必须使用一个可以节省大量工作的库时。即便如此,我还是试图将该库封装在一个不可变的结构中。如果事情无法改变,那么就更少担心了。
我应该补充一点,在你未来的努力中要记住的一些事情是STM和Actor模型。这两种并发方法都显示出非常好的进展。虽然每个都有一些开销,但根据程序的性质,这可能不是问题。
编辑:
以下是一些可以在下一个项目中使用的库的链接。有Deuce STM,顾名思义,它是Java的STM实现。然后是ActorFoundry,顾名思义,它是Java的Actor模型。但是,我不禁用其内置的Actor模型为Scala制作了插头。