2015-10-01 8 views
5

System.out "मानक" आउटपुट स्ट्रीम - PrintStream देता है। जावाडोक 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

'प्रिंटस्ट्रीम' होने के कारण जो थ्रेड सुरक्षित नहीं है, केवल आश्चर्यजनक से अधिक होगा, यह एक असफल समस्या भी पैदा करेगा। इसे थ्रेड सुरक्षित बनाने के लिए, आपको * हर * पहुंच को सुरक्षित रखना था, लेकिन दुर्भाग्य से, 'System.out' एक वैश्विक रूप से दृश्यमान संसाधन है और इसे एक्सेस करने वाले बहुत से कोड आपके नियंत्रण से बाहर हैं। हम केवल तीसरे पक्ष के पुस्तकालयों के बारे में बात नहीं कर रहे हैं बल्कि जेआरई के अंदर कोड भी लॉगिंग कर रहे हैं। – Holger

+0

@ होल्गर: आप मान रहे हैं कि 'System.out' को कई धागे से आउटपुट को क्रमबद्ध करने के लिए और/या दावा किया जाता है। मुझे उस दावे को कहीं भी नहीं बनाया जा रहा है। यदि लॉगिंग लाइब्रेरी एकाधिक सिस्टमों में 'System.out' के माध्यम से आउटपुट पर निर्भर है, तो इंटरमीस्ड नहीं किया जा रहा है, ठीक है, वे उस चीज़ पर भरोसा कर रहे हैं जिस पर उन्हें भरोसा नहीं किया जाना चाहिए। (शायद वे * उस पर भरोसा करने में सक्षम होना चाहिए, लेकिन गारंटी नहीं है।) –

संबंधित मुद्दे