2015-10-01 6 views
5

System.out возвращает «стандартный» выходной поток - a PrintStream. Javadoc из PrintStream ничего мне не говорит о безопасности потока, но, глядя на источник OpenJDK и OracleJDK говорит мне, что println синхронизируется.По умолчанию это System.out.println поточно-безопасный?

/** 
* Prints a String and then terminate the line. This method behaves as 
* though it invokes <code>{@link #print(String)}</code> and then 
* <code>{@link #println()}</code>. 
* 
* @param x The <code>String</code> to be printed. 
*/ 
public void println(String x) { 
    synchronized (this) { 
     print(x); 
     newLine(); 
    } 
} 

Это подходит очень хорошо для моего опыта: Вызов System.out.println() никогда не создавали «смешанные» выхода при вызове из разных потоков.

Так что мой вопрос (ы):

  1. Могу ли я рассчитывать на такое поведение (с использованием различных JVMs)?
  2. Есть ли какая-то документация, которую я пропустил, которая описывает это поведение?
+1

см. Также: http://stackoverflow.com/questions/9459657/synchronization-and-system-out-println – slipperyseal

ответ

6

Поскольку документация PrintStream, суперкласса FilterStream и его суперкласс OutputStream все не сказать ничего о безопасности потока или синхронизации, в теории, вы не можете полагаться на него, он не является частью контракта.

Я думаю, это было бы удивительным, если кто-то создал класс PrintStream, который не делал то, что делает Oracle в этом отношении, но я был удивлен раньше.

+1

Это! Если это не задокументировано, оно открыто для интерпретации. – paxdiablo

+0

Наличие «PrintStream», не являющегося потокобезопасным, было бы более чем просто удивительным, это также создало бы неразрешимую проблему. Чтобы сделать его потокобезопасным, вы должны были защищать * каждый * доступ к нему, но, к сожалению, «System.out» - это глобально видимый ресурс, и много кода доступа к нему находится вне вашего контроля. Мы говорим не только о сторонних библиотеках, но также и о коде регистрации внутри самой JRE. – Holger

+0

@Holger: вы предполагаете, что 'System.out' должен и/или претендовать на сериализацию вывода из нескольких потоков. Я не знаю, что это требование было сделано где угодно. Если библиотека протоколирования полагается на вывод через 'System.out' через несколько потоков, которые не смешиваются, ну, они полагаются на то, на что они не должны полагаться. (Возможно, они должны * полагаться на него, но гарантии там нет.) –