当前位置: 首页 > 面试题库 >

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

张勇
2023-03-14
问题内容

如果多个线程在不同步的情况下调用System.out.println(String),输出是否可以交错?还是每行的写入都是原子的?该API只字不提同步的,所以这似乎是可能的,或者是由交错缓冲和/或虚拟机存储器模型等防止输出?

编辑:

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

System.out.println("ABC");

保证输出是:

ABC
ABC

或者可能是:

AABC
BC

问题答案:

由于API文档没有提及System.out对象的线程安全性,因此该PrintStream#println(String)方法 也不能假定它是线程安全的。

但是,特定JVM的基础实现完全有可能对该println方法使用线程安全函数(例如printf 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应用程序,该应用程序会将有关它收到的消息的信息输出到控制台以进行调试。每次应用程序收到消息时,它将在消息上调用。 我遇到的问题是,如果应用程序被消息淹没,则会打印错误信息(例如旧缓冲区信息)。这使我想知道是否存在线程问题,即多个线程一次调用该函数,而没有正确刷新缓冲区。 在我的主程序(线程)中,我有以下效果: 在我的线程中,我有以下效果: 是否有一种简单的方法可以

  • 问题内容: 当我执行以下操作时,我想知道确切的输出是什么。 我知道它提供了一些与对象有关的东西,因为我的输出是 data @ 1ae73783 。我猜 1ae73783 是一个十六进制数字。我也做了一些工作并打印 我得到了号码 415360643 。我得到一个整数值。我不知道返回什么,仍然出于好奇,当我将 1ae73783 转换为十进制时,我得到 415360643 ! 这就是为什么我对这个数字到

  • 我有一个java maven项目,我希望使用多线程进行测试。我在src/test中有testng.xml,maven surefire插件被配置为使用它。就像这个页面一样:http://maven.apache.org/surefire/maven-surefire-plugin/examples/testng.html 编辑:增加了一定的pom条目

  • Workerman有一个依赖pthreads扩展的MT多线程版本,但是由于pthreads扩展还不够稳定,所以这个Workerman多线程版本已经不再维护。 目前Workerman及其周边产品都是基于多进程单线程的。

  • 我想5是int。但没有变数。我不知道为什么输出是双倍。我已经试过Netbeans了。

  • 问题内容: Scrapy中很少有并发设置,例如CONCURRENT_REQUESTS。这意味着Scrapy搜寻器是多线程的吗?因此,如果我运行它,将在字面上并行触发多个同时请求?我问是因为,我读过Scrapy是单线程的。 问题答案: Scrapy是单线程的,除了交互式外壳程序和一些测试之外,请参见source。 它建立在Twisted的基础上,Twisted也是单线程的,并且利用了它自己的异步并发