默认情况下,Java 的 System.out.println() 方法是否与线程互斥?



或者我需要一个锁来将同步输出打印到屏幕上吗?

例如

//Main
public static void main(String[] args) {
   MyThread myThread1 = new MyThread();
   MyThread myThread2 = new MyThread();
   Thread thread1 = new Thread(myThread1);
   Thread thread2 = new Thread(myThread2);
   thread1.start();
   thread2.start();
}
//Custom thread 
public class MyThread() {
   public void run() {
      System.out.println("Is this method a shared resource that needs to be locked?");
   }
}

以上内容会受到比赛条件的影响吗?或者System.out.println()是通过同步实现的?

Makoto的答案都是真的,但这并不是全部真相。java.io.PrintStream的文档中没有提到线程。在同一个正式流上对print(...)方法的重叠调用的行为是未定义的。

你能容忍代码中未定义的行为吗?通常情况下,经过充分的测试,答案是肯定的。但是,如果你的代码中的一个漏洞可能威胁到人们的生命,威胁到一些大型公司的财务,威胁到历史性太空任务的成功,等等,那么依赖未定义的行为可能会限制你的职业生涯。

由于println的实现是在该实例上同步的,因此流几乎不可能自损坏。

然而,如果你有不同的线程打印不同的东西,你可能会看到不确定性的行为,因为你认为打印的东西的顺序并不是它们实际的顺序。这与您正在写入的流的实际损坏无关。

是的,你有可能进入比赛状态。。。部分消息将由一个线程写出。

解决方案是使用一个类似log4j的记录器。查看本教程。

相关内容

最新更新