为什么System.out.prinln乱序?

Dav*_*vid 2 java println system.out

System.out.prinln不时想用来调试东西而不是使用调试器,或者我想要一个简单的程序写入标准输出,这样我就可以记录一些东西而不花时间来设置正确的日志.我注意到有时候我的文字会不按顺序打印出来.例如:

System.out.println("A");
System.out.println("B");    
System.out.println("C");
Run Code Online (Sandbox Code Playgroud)

可能导致

A
C
B
Run Code Online (Sandbox Code Playgroud)

正在印刷.

我很确定我不是疯了,所以我有两个问题:

  1. 为什么会这样?
  2. 什么是一种简单的方法,我可以防止这种情况发生?

编辑:更多信息:

我正在运行使用JUnit构建Lucene查询的单元测试.为了打印出来,我写了这堂课:

public class LogHelper { //TODO-DAVID remove
    public static final boolean ENABLED = true;
    public static final boolean DISABLED = false;

    private boolean enabled;

    public LogHelper(boolean enabled){
        this.enabled = enabled;
    }

    public synchronized void debug(String someString){
        if(enabled){
            System.out.println(someString);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我尝试将'debug()'同步,以防多个线程调用它,但奇怪的打印偶尔也会发生故障.

Rya*_*art 9

除非打印在不同的线程中发生,否则永远不会发生这种情况.然后执行顺序可能是不确定的.如果,另一方面,你写System.outSystem.err,看到混乱的输出,这是因为这是两个不同的数据流中发生写入默认情况下,精确的输出相同,且一方或另一方可能会先出来,特别是由于缓冲或其他考虑因素.