java - System.out.println 的多线程输出是否交错

标签 java multithreading synchronization printstream

如果多个线程在没有同步的情况下调用 System.out.println(String),输出会交错吗?或者每一行的写入都是原子的? API没有提到同步,所以这似乎是可能的,或者是缓冲和/或虚拟机内存模型等阻止了交错输出?

编辑:

例如,如果每个线程包含:

System.out.println("ABC");

输出保证为:

ABC
ABC

或者可能是:

AABC
BC

最佳答案

由于 API 文档没有提及 System.out object 上的线程安全性PrintStream#println(String) method 也没有你不能假设它是线程安全的

但是,特定 JVM 的底层实现完全有可能对 println 方法使用线程安全函数(例如 printf on glibc ),因此,实际上,输出将是根据您的第一个示例保证(始终 ABC\n 然后 ABC\n,在第二个示例中绝不散布字符)。但请记住,有很多 JVM 实现,它们只需要遵守 JVM 规范,而不是该规范之外的任何约定。

如果您绝对必须确保不会像您所描述的那样散布 println 调用,那么您必须手动强制执行互斥,例如:

public void safePrintln(String s) {
  synchronized (System.out) {
    System.out.println(s);
  }
}

当然,这个例子只是一个说明,不应该被视为“解决方案”;还有许多其他因素需要考虑。例如,上面的 safePrintln(...) 方法只有在所有代码都使用该方法且没有任何内容调用 System.out.println(... )直接

关于java - System.out.println 的多线程输出是否交错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58382899/

相关文章:

java - JSTL:BigDecimal 的绝对值(正确的方法...)

multithreading - 在 linux 中信号处理程序的执行是不可抢占的吗?

database - SQL Server - 在 2 个不同的数据库上同步 2 个表

javascript - PouchDB 和 ANGULARJS - 最佳设计方式

java - Checkstyle 报告捕获异常参数的 LocalFinalVariableNameCheck 错误

java - 为什么我不能创建字符串和通用对象的映射

java - 使用 SessionFactory bean 的 setter 注入(inject)时出现 NullPointerException

gwt - GWT 中的线程(客户端)

java - 启动工作线程然后加入它们的正确方法是什么?

java - 并发访问对 HashSet 的影响