Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
默认情况下,Java的System.out.println()方法对线程是互斥的吗?_Java_Multithreading_Output - Fatal编程技术网

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

默认情况下,Java的System.out.println()方法对线程是互斥的吗?,java,multithreading,output,Java,Multithreading,Output,或者我需要一个锁来将同步输出打印到屏幕上 e、 g 上述情况是否会受到比赛条件的影响?或者System.out.println是通过同步实现的?是的,存在一种威胁,即您将进入竞争条件。。。部分消息将由一个线程写出 解决方案是使用log4j这样的记录器。请查看此信息。由于在该实例上同步了,因此流几乎不可能自损坏 然而,如果你有不同的线程打印不同的东西,你可能会看到不确定性的行为,因为你感知的东西打印的顺序不是它们实际的顺序。这与你所写的流的实际损坏无关。Makoto的回答是完全正确的,但不是全部事

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

e、 g


上述情况是否会受到比赛条件的影响?或者System.out.println是通过同步实现的?

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

解决方案是使用log4j这样的记录器。请查看此信息。

由于在该实例上同步了,因此流几乎不可能自损坏


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

Makoto的回答是完全正确的,但不是全部事实。java.io.PrintStream的文档没有提到线程。打印的重叠调用的行为。。。同一流上的方法通常未定义


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

定义种族条件。至少,无法保证哪个线程将首先打印其消息。我不完全确定您的问题-您是否担心消息流将与两个输出交错?也许这将回答您的问题Pshemo的要点是printlnObject是同步的,因此单个字符串将是原子的,虽然连续的行可能在线程之间交错。@OliverCharlesworth,我所说的竞争条件是指在打印整个字符串之前抢占一条打印语句,并将其与其他一些线程输出连接起来。记录器不用于替换任意的标准输出操作。很抱歉,println不是线程安全的。在本例中,有多个线程写入System.out@佛顿:呃……你有没有读得更深入一点?公认的答案实际上证实了这里讨论的内容。不仅如此,如果你检查这个答案中链接的println的源代码,实际源代码中描述的行为与答案中建议的完全相同。此外,如果正在写入的流的输出突然被另一个流的输出占用,那么多线程写入System.out只是一个线程安全问题。这根本不会发生,因为打印过程中存在同步。您将在不同的时间看到不同的输出;这将是非确定性行为,而不是缺乏线程安全性。我要说的是,您不能假设所有JVM都是这样。。。因为文档中没有提到这个方法是同步的。我所说的是,有一种威胁,可能会写出一些奇怪的东西。我感谢您的输入@james large。这是很重要的一点。我确信,如果文档没有指定任何java.io.PrintStream的同步,某些实现可能不会麻烦地锁定它。幸运的是,提示我这个问题的特定代码没有您所描述的任何后果,但是在将来,仔细检查您正在使用的实现的文档将是明智的。
//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?");
   }
}