java - A thread-safe holder for arbitrary cloneable data -


मेरे पास एक वर्ग SomeMutableData एक सार्वजनिक क्लोन () विधि के साथ है । मैं यह सुनिश्चित करना चाहता हूं, कि कोई थ्रेड कभी भी असंगत राज्य को नहीं देखता (यह माना जाता है कि धारक का प्रयोग केवल आस पास हो जाएगा)। मैं सिंक्रनाइज़ेशन का उपयोग कर रहा हूं सबसे सुरक्षित संभावना है, ठीक?

  सार्वजनिक अंतिम श्रेणी थ्रेडसाफहॉल्डर {सार्वजनिक थ्रेडसाफहॉल्डर (कुछमूटडेटा डेटा) {storeData (डेटा); } सार्वजनिक सिंक्रनाइज़ किया गया SomeMutableData क्लोनडेटा () {return data.clone (); } सार्वजनिक सिंक्रनाइज़ किए गए शून्य संग्रह डेटा (कुछकुछ डेटा डेटा) {this.data = data.clone (); } निजी SomeMutableData डेटा; }   

क्या पहला दृष्टिकोण के रूप में सुरक्षित है?

  सार्वजनिक अंतिम वर्ग थ्रेडसाफहॉल्डर 2 {सार्वजनिक थ्रेडसाफहॉल्डर 2 (कुछमूटडेटा डेटा) {storeData (डेटा); } सार्वजनिक SomeMutableData क्लोनडेटा () {return data.get ()। क्लोन (); } सार्वजनिक शून्य संग्रह डेटा (कुछकुछ डेटा डेटा) {this.data.set (data.clone ()); } निजी अंतिम परमाणु संदर्भ & lt; SomeMutableData & gt; डेटा = नया परमाणु संदर्भ & lt; SomeMutableData & gt; (); चूंकि क्लोन () सिंक्रनाइज़ करने के मुकाबले ज्यादा महंगा है, इसलिए यह शायद ही किसी से बात करता है। दृश्य के प्रदर्शन बिंदु  

हालांकि दूसरा उदाहरण धागा सुरक्षित और मामूली तेजी से है।

केवल अंतर यह है कि आप ऐसा पहला उदाहरण कर सकते हैं (चाहे आपको यह पसंद है या नहीं;) <प्री> सिंक्रनाइज़ (द होल्डर) {कुछमुटायीडेटा smd = theHolder.cloneData (); smd.updateIt (); theHolder.storeData (smd); }

बीटीडब्लू: मुझे नहीं लगता है कि धारक को लपेटने वाले प्रकार को विस्तारित करना चाहिए।

संपादित करें: एक और जीसी दोस्ताना तरीका निम्न दृष्टिकोण का उपयोग करना है I आप copyFrom लिख सकते हैं (जैसे कि) कोई ऑब्जेक्ट बनाया नहीं है या तो डेटा सेट करना या प्राप्त करना।

  सार्वजनिक अंतिम श्रेणी थ्रेडसाफहॉल्डर {निजी फाइनल SomeMutableData data = new SomeMutableData (); सार्वजनिक थ्रेडसेफहॉल्डर (कुछकुछ डेटा डेटा) {copyFrom (डेटा); } सार्वजनिक सिंक्रनाइज़ किए गए शून्य प्रतिलिपि (कुछमाउंटडेटाडेटा डेटा) {data.copyFrom (this.data); } सार्वजनिक सिंक्रनाइज़ किया गया शून्य प्रतिलिपि (कुछकुछ डेटा डेटा) {this.data.copy से (डेटा); }}    

Comments