是System.out.println交织的多线程输出。

是System.out.println交织的多线程输出。

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

编辑:

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

System.out.println("ABC");

是否保证输出为:

ABC
ABC

或者可能是:

AABC
BC


HUX布斯
浏览 592回答 3
3回答

沧海一幻觉

由于api文档没有提到线程安全,所以System.out对象也不是PrintStream#println(String)方法 您不能假设它是线程安全的。.但是,一个特定jvm的底层实现完全有可能使用线程安全函数作为println方法(如:printf关于滑翔),以便在实际情况下,在第一个示例中保证输出(总是ABC\n然后ABC\n,不要在第二个示例中穿插字符)。但是请记住,有很多JVM实现,它们只需要遵守JVM规范,而不是规范之外的任何约定。如果你绝对要确保如您所述,没有println调用会中断,那么您必须手动执行互斥,例如:public void safePrintln(String s) {   synchronized (System.out) {     System.out.println(s);   }}当然,这个例子只是一个例子,不应被视为“解决办法”;还有许多其他因素需要考虑。例如,safePrintln(...)方法只有在以下情况下才是安全的。全代码使用该方法,没有调用。System.out.println(...)直接。

MYYA

只要你不改变OutputStream通孔System.setOut它是线程安全的。虽然它是线程安全的,但是您可以让许多线程写入到System.out使.Thread-1   System.out.println("A");   System.out.println("B");   System.out.println("C");Thread-2   System.out.println("1");   System.out.println("2");   System.out.println("3");能读1 2 A 3 B C在其他组合中。因此,要回答你的问题:当你写信给System.out-它获得了一个锁OutputStream实例-然后它将写入缓冲区并立即刷新。一旦释放锁,OutputStream被冲了脸写到。没有一个实例可以将不同的字符串连接起来,例如1A 2B.编辑以回答您的编辑:这不会发生在System.out.println..因为PrintStream同步整个函数,它将填充缓冲区,然后原子地刷新它。进来的任何新线程现在都将有一个新的缓冲区可供使用。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java