多线程 System.out.println() 交错:线程安全困境
问题出现:可以从 System.out 输出如果没有同步,多线程的 .println(String) 会交错?
API 仍然存在对线程安全保持沉默,留下了怀疑的空间。虽然交错输出在理论上是可行的,但由于缓冲、内存模型或 JVM 实现的原因,实际情况可能会有所不同。
例如,如果每个线程都执行 System.out.println("ABC"),则可能会期望输出为“ABCnABC”,表示没有交错。然而,“AABCnBC”也是合理的。
解决难题
API 文档不保证 System.out 的线程安全,这意味着可以进行交错。尽管如此,一些 JVM 实现可能会利用 println 中的线程安全机制(如 glibc 的 printf),以确保输出保真度。
但是,依赖 JVM 特定的实现是有风险的。为了确保完整的输出完整性,需要手动互斥:
public void safePrintln(String s) { synchronized (System.out) { System.out.println(s); } }
请注意,只有在所有代码一致使用 safePrintln 并避免直接调用 System.out.println 时,这才会防止交错。
以上是System.out.println() 在多线程 Java 中是线程安全的吗?的详细内容。更多信息请关注PHP中文网其他相关文章!