3

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

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

可能导致

A
C
B

正在打印。

我很确定我没有疯,所以我有两个问题:

  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);
        }
    }
}

我尝试使'debug()'同步,以防多个线程调用它,但奇怪的打印仍然偶尔会出现乱序。

4

2 回答 2

9

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

于 2013-10-19T00:40:48.890 回答
0

我敢肯定,您的示例在单个线程上永远不会发生..

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

于 2013-10-19T01:33:52.853 回答