如果多个线程在没有同步的情况下调用 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/