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

时间:2014-09-27 20:17:13

标签: java multithreading output

或者我需要锁定才能将同步输出打印到屏幕上?

e.g。

//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()是通过同步实现的吗?

3 个答案:

答案 0 :(得分:1)

Makoto的回答都是真的,但这不是全部真相。 java.io.PrintStream的文档没有提及线程。

>在同一个流上对print(...)方法重叠调用的行为是不明确的。

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

答案 1 :(得分:0)

由于implementation of println在该实例上已同步,因此该流几乎不会自我腐败。

但是,如果您有不同的线程打印不同的东西,您可能会看到非确定性行为,因为您认为要打印的内容的顺序不是它们实际的顺序。这是你正在写的流的实际腐败的另一个问题。

答案 2 :(得分:-3)

是的,存在威胁,您将进入竞争条件......部分消息将由一个线程写出。

解决方案是使用log4j之类的记录器之一。请查看此tutorial