为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

HUX布斯 2019-07-09 14:48:09
是System.out.println交织的多线程输出。如果多个线程在没有同步的情况下调用System.out.println(String),那么输出会被交错吗?还是每一行的书写都是原子的?这个API没有提到同步,所以这似乎是可能的,或者通过缓冲和/或VM内存模型来阻止交错输出,等等?编辑:例如,如果每个线程包含:System.out.println("ABC");是否保证输出为:ABC ABC或者可能是:AABC BC
查看完整描述

3 回答

?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

由于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(...)直接。


查看完整回答
反对 回复 2019-07-09
?
MYYA

TA贡献1868条经验 获得超4个赞

只要你不改变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同步整个函数,它将填充缓冲区,然后原子地刷新它。进来的任何新线程现在都将有一个新的缓冲区可供使用。


查看完整回答
反对 回复 2019-07-09
  • 3 回答
  • 0 关注
  • 591 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信