如何确保线程获取由另一个线程修改的最新变量?

时间:2011-09-27 00:26:40

标签: java multithreading

好的,所以我正在制作一个2D游戏,所有的地图都用2D数组表示。我有这个巨大的方法,根据地图中已有的内容修改地图。因此,经过一段时间的实现功能,FPS正在降低,所以我决定尝试使用多个线程来加快速度(好的,没有?)。

我做了3个线程来完成工作,一个绘制和处理事件,一个更新地图的基础部分,另一个更新另一组变量。问题是,它绘制但是当我启动所有3个线程时它不会更新。当我从绘制线程调用方法时它会更新。我通过添加“System.exit(0);”测试了第一个更新线程在跑步时,它没有开始,否则将开始。我还尝试直接在更新线程的run方法中手动更改地图的图块,但它没有做任何事情。所以我总结了执行运行,并修改了变量。所以我认为画家使用的变量可能不是更新的。

所有变量都在一个单独的类中并且是静态的(是吗?)并且被一个对象访问,但后来我用代码“nameOfTheClass.variableName”将其更改为“Direct”Access(IDE Suggestion) / p>

几乎忘了提一下,事件(在带有paint()方法的类中)修改了Map,这部分确实有效。

我不知道该怎么办,有人有个主意吗?

2 个答案:

答案 0 :(得分:1)

您需要将违规变量标记为volatile,这将阻止编译器在本地变量中缓存副本,而不是每次都读取/写入实际值。

答案 1 :(得分:0)

我认为问题是竞争条件。随着其他访问的进行,变量修改可能会“延迟”(几百纳秒?),但最终仍会发生。在这种情况下,我不认为volatile或类似的东西会产生影响,因为线程同步的顺序不应该很重要。如果是的话,你有更大的事情需要担心。另外,我认为你的术语可能有些混乱 - 我无法真正理解与你的代码相关的线程问题。

如果您需要硬同步,则可以建立资源“围栏”(同步块)并在这些围栏内保持资源访问,以便不会发生竞争条件。您在操作这些变量时,根据事实建立事务,即没有任何东西可以进入围栏。