为什么System.out.println乱序?

时间:2013-10-19 00:37:13

标签: java println system.out

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

System.out.println("A");
System.out.println("B");    
System.out.println("C");

可能导致

A
C
B

正在打印。

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

  1. 为什么会这样?
  2. 我可以通过什么方式避免这种情况发生?
  3. 编辑:更多信息:

    我正在运行使用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);
            }
        }
    }
    

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

2 个答案:

答案 0 :(得分:9)

除非打印在不同的线程中发生,否则永远不会发生。然后执行顺序可能是不确定的。另一方面,如果您正在写System.outSystem.err并看到混乱的输出,那是因为那些是两个不同的流,它们碰巧写入默认的完全相同的输出,并且一个或另一个可能首先出现,特别是由于缓冲或其他考虑因素。

答案 1 :(得分:0)

我相信你的例子永远不会发生在一个线程上..

无论如何,确保你没有System.out.println(内部可能创建新线程的函数调用...特别是调用OS系统的函数..它们通常搞乱......