Java代码需要一个system.out.println语句来运行

我想知道是否有其他人遇到过这个问题。 我游戏中的这部分代码依赖于system.out.println语句来工作。 没有它,它将无法正常运作

while(isladder){ t = Map.tiles[(int) (Player.x + 15 + ScrollManager.xoffset) / 32][(int) ((Player.y ) + ScrollManager.yoffset) / 32]; if(t.row == 3 && t.col == 5){ ScrollManager.dy = -.5; System.out.println(t.row); }else{ ScrollManager.nogravity = false; } } 

这是在有人点击向上键时启动的线程。 这是我正在制作的2D游戏的阶梯。 没有system.out.println代码,播放器将继续悬浮在空中。 有了它,玩家将像往常一样停在梯子顶部

(更新)我通过添加Thread.sleep(1)来修复它,使其运行更顺畅

您正在受到线程内存缓存的攻击,这是一种优化技术,当JIT确定给定的内存块没有同步问题时,JIT用它来加速程序,并且不需要与主内存同步。

相关问题: 如何演示javamultithreading可见性问题?

实质上是这样的:

1)JIT加载类,并读入while()循环2) isladder变量未声明为volatile ,并且不通过任何synchronized方式检索,因此JIT认为:
“哦,这个变量基本上是本地的 – 我有本地的isladder的线程缓存,只是使用它,所以它运行得更快。”

如果在循环中不包含任何倾向于触发上下文切换的操作,如Thread.sleep(),System.out.println()I / O,则isladder的缓存值永远不会刷新。

虽然Thread.sleep()解决了表面问题,但它没有解决代码中的根问题,即缺乏对游戏状态的同步访问。 你发布的这个post似乎只是修改滚动窗口,因此是相当无害的,但是当你有线程控制动画对象,敌人等东西时,糟糕的multithreading练习会导致自发的,看似随机的,不可预测的结果。