2015-10-01 18 views
5

System.out trả về luồng đầu ra "chuẩn" - số PrintStream. Các javadoc của PrintStream nói với tôi gì về chủ đề an toàn nhưng nhìn vào nguồn gốc của OpenJDKOracleJDK nói với tôi rằng println được đồng bộ.Là System.out.println thread-safe theo mặc định?

/** 
* 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(); 
    } 
} 

Điều đó phù hợp với trải nghiệm của tôi: Gọi System.out.println() không bao giờ được tạo ra 'hỗn hợp' khi gọi từ các chủ đề khác nhau.

Vì vậy, câu hỏi của tôi (s):

  1. Tôi có thể dựa vào hành vi này (sử dụng khác nhau JVM)?
  2. Có một số tài liệu mà tôi đã bỏ lỡ mô tả hành vi này không?
+1

cũng xem: http://stackoverflow.com/questions/9459657/synchronization-and-system-out-println – slipperyseal

Trả lời

6

Kể từ tài liệu của PrintStream, lớp cha của nó FilterStream, và lớp cha của nó OutputStream tất cả không nói bất cứ điều gì về chủ đề an toàn hoặc đồng bộ hóa, về mặt lý thuyết bạn không thể dựa vào nó, nó không phải là một phần của hợp đồng.

Tôi nghĩ rằng nó sẽ là ngạc nhiên nếu ai đó tạo ra một lớp PrintStream điều đó không làm những gì Oracle làm trong lĩnh vực này, nhưng tôi đã ngạc nhiên trước đó.

+1

Điều này! Trừ khi nó được ghi chép rõ ràng, nó mở để giải thích. – paxdiablo

+0

Việc có một 'PrintStream' không an toàn sẽ không chỉ gây ngạc nhiên, nó cũng sẽ tạo ra một vấn đề nan giải. Để làm cho nó thread an toàn, bạn phải bảo vệ * mọi * truy cập vào nó, nhưng thật không may, 'System.out' là một tài nguyên có thể nhìn thấy trên toàn cầu và rất nhiều mã truy cập nó nằm ngoài tầm kiểm soát của bạn. Chúng tôi không chỉ nói về các thư viện của bên thứ ba mà còn phải ghi lại mã bên trong chính JRE. – Holger

+0

@ Holger: Bạn giả sử 'System.out' được cho là và/hoặc xác nhận quyền sở hữu đối với đầu ra tuần tự từ nhiều luồng. Tôi không nhận thức được yêu cầu đó được thực hiện ở bất cứ đâu. Nếu một thư viện đăng nhập dựa vào đầu ra thông qua 'System.out' trên nhiều luồng không được trộn lẫn, thì chúng sẽ dựa vào thứ gì đó mà chúng không nên dựa vào. (Có lẽ họ * nên * để có thể dựa vào nó, nhưng sự bảo đảm không có ở đó.) –

Các vấn đề liên quan