2012-06-17 2 views
7

:PrintWriter는 스레드로부터 안전한가요? 다음 감안할 때

public class CConsole { 
    public static PrintWriter pw = new PrintWriter(System.out, true); 
} 

CConsole.pw.format("%d %d", x, y) 스레드 안전합니까? 즉, 여러 스레드가이 호출을 사용할 수 있으며 스레드 안전성으로 설명 할 수 있습니다. PrintWriter 클래스 설명이나 format() 메소드 설명에는 표시되지 않습니다.

+0

[이 답변] (http://stackoverflow.com/a/714424/1079354)에 대한 의견을 밝힐 수 있습니다. – Makoto

+1

[Java 소켓의 PrintWriter 스레드가 안전합니까?] (http://stackoverflow.com/questions/714287/is-a-java-sockets-printwriter-thread-safe) –

+0

나는 그것을 보았습니다. 그것은 정확히 같은 질문이 아니며 아무런 증거도 없습니다. – H2ONaCl

답변

8

...

PrintWriter의 슈퍼 클래스가 명시 적으로 모든 중요한 부분이 명시 적으로 Writer 인스턴스 자체에, 또는에 중 동기화 생성자 설명서에 언급이다 Writer, 지정된 개체.따라서 Writer은 명시 적으로 스레드로부터 안전합니다 ...

불행히도 PrintWriter 하위 클래스 설명서는 명시 적으로 그러한 약속을하지 않습니다. Writer 잠금 개체를 상속하지만 추가 또는 재정의 된 메서드가 여전히 스레드로부터 안전한지 여부를 알 수있는 방법은 없습니다.

다른 한편, 내가 말할 수있는 한, 거의 모든 방법으로 synchronized 블록을 포함하는 Sun/OpenJDK PrintWriter implementation을 말할 수 있습니다. 그러나 이것은으로 명시 적으로 문서화 된 동작으로 보이지 않습니다.

차라리 ... 라인이라고하는 here에서 촬영

0

아니요. 실제로는 스레드로부터 안전하지 않습니다. PrintWriter.java here에서

쓰기를 (참조) methonds

그들은 잠금 동기화 쓰기가 (here 정의 -. 라이터 객체 인이이에 동기화 된 경우 것이라고했습니다 된 스레드 안전하지만, 이 경우는 없습니다.

+0

스레드로부터 안전하지 않다는 것은 무엇을 의미합니까? 자물쇠는 무엇과 관련이 있습니까? – Amareswar

5

영업 링크 된 질문에 대한 답변을 이해하지 못하는 (또는 어쩌면 믿지 않는) 때문에, 내가 그들을 다시 언급 할 것이다.

  • 주요 사양 (즉, 자바 docs)는 클래스가 스레드로부터 안전한지 여부를 명시하지 않습니다.

  • 모든 관련 작업이 적절하게 동기화된다는 점에서 스레드로부터 안전하다는 것을 소스 코드에서 분명히 알 수 있습니다.

  • 위의 의미에서 오라클이 의도적으로 구현을 변경하여 스레드로부터 안전하지 않게하는 것은 불가능합니다.

  • 그러나, PrintWriter 완전히 스레드 안전하지 않을 것입니다 사용 사례가있다 :

    • 하나의 PrinterWriter가 여러 스레드를 사용하는 경우는, 결과는 출력의 예측할 수없는 인터리빙을 할 수 있습니다 스레드; 예 : 그들이 println 대신 print를 사용한다면.

    • 동일한 기본 스트림에 PrintWriter이 여러 개있는 경우 PrintWriter 내부적으로 사용하는 경우 BufferedWriter이며 잠금 문제로 인해 문제가 발생할 수 있습니다. 요약

(오라클/오픈 JDK 코드베이스에서) 현재 PrintWriter 구현은 스레드 안전하지만, 당신은 여전히 ​​어떤 상황에주의해야하고, 가능성의 다른 구현도있다 스레드로부터 안전하지 않을 수 있습니다. 발견 @KazekageGaara 견적은 오라일리 텍스트 책이다


주 - 마크 그랜드와 조나단 크 누드 센에 의해 "자바 기본 클래스 참조". 공식적인 Sun/Oracle 간행물이 아니기 때문에 확정적인 것은 아닙니다. 이 질문에 간단한 대답이없는

1

를 안전하게 재생하고 문서화되지 않은 동작에 의존하고 장기적으로 후회보다 PrintWriter는, - 스레드로부터 안전하지 않습니다 가정 것입니다 :

기본 출력 스트림에 여러 번 쓰는 PrintWriter의 모든 메서드는 내부적으로 동기화를 처리하므로 PrintWriter 개체는 스레드로부터 안전합니다.

+0

깨진 링크 ... –

+0

이 견적의 출처는 "Java Fundamental Classes Reference" Mark Grand와 Jonathan Knudsen이 있습니다. 공식적인 Sun/Oracle 간행물이 아닌 OReilly 텍스트 북입니다. 에르고, 확실하지 않습니다. –

1
{ 
public void print(Object obj) 
    { 

     write(String.valueOf(obj)); 
    } 

    /* Methods that do terminate lines */ 

} 

인쇄는 당신이 인쇄 방법을 사용하는 경우, UR 자신의 "내 작가"를 작성하고 그것을 동기화, 그래서 ...

을 동기화되지 않습니다.

아니면

당신이 그 다음 동기화에 println()를 .... 사용하는 경우 ..

{ 

     public void println(Object x) { 
     String s = String.valueOf(x); 
     synchronized (lock) { 
      print(s); 
      println(); 
     } 
    } 

} 
1

네, 스레드 안전합니다. 왜 스레드로부터 안전하지 않다고 말하는 사람들이 있는지 이해할 수 없습니다. 확실히 '잠금'멤버가 있으며 해당 잠금 개체 아래에서 메서드가 완전히 동기화됩니다.

PrintWriter.print 메서드가 스레드로부터 안전하지 않지만 잘못되었습니다. PrintWriter.print는 확실히 thread-safe 인 write()를 호출합니다. 우리 모두는 write 메소드가 'lock'아래에서 동기화된다는 것을 알고 있습니다. 그래서 print 메소드는 암시 적/자연스럽게 스레드로부터 안전합니다.

printWriter.println은 모두 '독립적으로'스레드로부터 안전 한 print() 및 println(), 을 호출하므로 자체적으로 동기화되어야합니다.

관련 문제