मैं मल्टी थ्रेडिंग के संबंध में अच्छी प्रतिष्ठा के कारण जोडा का उपयोग कर रहा हूं। यह बहु थ्रेडेड डेट हैंडलिंग कुशल बनाने के लिए बहुत दूर है, उदाहरण के लिए सभी दिनांक/समय/डेटटाइम ऑब्जेक्ट्स अपरिवर्तनीय बनाकर।आंशिक रूप से निर्मित ऑब्जेक्ट/मल्टी थ्रेडिंग
लेकिन यहां एक ऐसी स्थिति है जहां मुझे यकीन नहीं है कि जोडा वास्तव में सही काम कर रहा है या नहीं। यह शायद करता है, लेकिन मुझे एक स्पष्टीकरण देखने में बहुत दिलचस्पी है।
/* org.joda.time.base.AbstractInstant */
public String toString() {
return ISODateTimeFormat.dateTime().print(this);
}
सभी formatters (वे के रूप में अच्छी अपरिवर्तनीय) धागा सुरक्षित हैं, लेकिन क्या फ़ॉर्मेटर-कारखाने के बारे में बताया गया है::
दिनांक समय की एक toString() Joda बुलाया जा रहा है जब निम्नलिखित करता है
private static DateTimeFormatter dt;
/* org.joda.time.format.ISODateTimeFormat */
public static DateTimeFormatter dateTime() {
if (dt == null) {
dt = new DateTimeFormatterBuilder()
.append(date())
.append(tTime())
.toFormatter();
}
return dt;
}
यह सिंगल थ्रेडेड अनुप्रयोगों में एक आम पैटर्न है लेकिन इसे बहु-प्रसारित वातावरण में त्रुटि-प्रवण माना जाता है। > सबसे खराब स्थिति - अशक्त जांच के दौरान
- दौड़ हालत: दो वस्तुओं बनाया हो
मैं निम्नलिखित खतरों को देखते हैं।
कोई समस्या नहीं है, क्योंकि यह पूरी तरह से एक सहायक वस्तु है (सामान्य सिंगलटन पैटर्न की स्थिति के विपरीत), कोई डीटी में सहेजा जाता है, दूसरा खो जाता है और कचरा जल्द या बाद में एकत्र किया जाएगा।
- से पहले ओर्ब प्रारंभ समाप्त कर दिया गया
स्थिर चर एक आंशिक रूप से निर्माण वस्तु को इंगित कर सकते हैं (मुझे पागल कॉल करने से पहले, इस Wikipedia article में इसी तरह की स्थिति के बारे में पढ़ा।)
तो जोडा कैसे सुनिश्चित करता है कि इस स्थैतिक चर में कोई आंशिक रूप से निर्मित फॉर्मेटर प्रकाशित नहीं होता है?
अपने स्पष्टीकरण के लिए धन्यवाद!
रीटो
+1। यही एक और कारण है कि जावा समवर्ती मॉडल में अपरिवर्तनीय वस्तुएं 'सरल' हैं। हालांकि, मुझे आपके पिछले पैराग्राफ के बारे में निश्चित नहीं है, जेएलएस 17.4.4 देखें: "प्रत्येक चर में डिफ़ॉल्ट मान (शून्य, झूठी या शून्य) का लिखना सिंक्रनाइज़ करता है-प्रत्येक थ्रेड में पहली क्रिया के साथ"। यह आवश्यक है कि "डिफ़ॉल्ट मान का लेखन" डीटी के पढ़ने से पहले होता है। – irreputable
हां, डिफ़ॉल्ट मान का लेखन डीटी के पढ़ने से पहले है। यह थ्रेड को "कचरा" मान पढ़ने से रोकता है। लेकिन किसी अन्य धागे (जो डीटी क्षेत्र शुरू किया गया) में क्षेत्र का एक लेखन डीटी पढ़ने के साथ एचबी-रिलेशन में नहीं है। इस प्रकार हम किसी भी समय उन दो में से किसी एक को लिख सकते हैं (डिफ़ॉल्ट या थ्रेड से शुरू किया गया था)। एकमात्र समय जब हमें एक डिफ़ॉल्ट प्रारंभिक मान पढ़ना होगा, तो आकस्मिक आवश्यकता जांच है। लेकिन उस समय हम केवल डिफ़ॉल्ट मान के साथ एक ही पठन करते हैं और अगले पुनरावृत्ति पर कहते हैं कि वह धागा किसी ऑब्जेक्ट को डीटी (केवल विधि में पढ़ने के लिए) लिखता है। – maxkar