2013-02-10 12 views
12

मेमोरी को बचाने के लिए मैं जावा में String.intern() का उपयोग करना चाहता हूं (उसी सामग्री के साथ स्ट्रिंग के लिए आंतरिक पूल का उपयोग करें)। मैं इस विधि को विभिन्न धागे से बुलाता हूं। कोई समस्या है?String.intern() थ्रेड सुरक्षित

+4

अगर यह थ्रेडसेफ नहीं है तो बहुत आश्चर्यचकित होगा। वह पुस्तकालय डिजाइन में एक प्रमुख दोष होगा। – CodesInChaos

+0

उन तारों से कहां से आते हैं? – jlordo

+0

@jlordo - कोई स्ट्रिंग अभिव्यक्ति जो संकलन-समय स्थिर नहीं है स्वचालित रूप से आंतरिक नहीं है। तो, उदाहरण के लिए, 'नया स्ट्रिंग ("एबीसी")! = "एबीसी" '; हालांकि, '" ab "+" c "==" abc "' (इंटर्निंग के कारण)। –

उत्तर

4

आपके प्रश्न का संक्षिप्त उत्तर हाँ है। यह धागा-सुरक्षित है।

हालांकि, आप मेमोरी खपत को कम करने के लिए इस सुविधा का उपयोग करके पुनर्विचार करना चाहेंगे। कारण यह है कि आप आंतरिक तारों की सूची से किसी भी entires को हटाने में असमर्थ हैं। इसके लिए अपनी सुविधा बनाने का एक बेहतर समाधान होगा। आप सभी की जरूरत होगी एक HashMap<String,String> इसलिए की तरह में अपने तार स्टोर करने के लिए है:

public String getInternedString(String s) { 
    synchronized(strings) { 
     String found = strings.get(s); 
     if(found == null) { 
      strings.put(s, s); 
      found = s; 
     } 
     return found; 
    } 
} 
+3

(प्लस लॉकिंग, चूंकि ओपी थ्रेड सुरक्षा चाहता है) – CodesInChaos

+2

आप भयानक 'इंटर्न' प्रदर्शन का भी उल्लेख कर सकते हैं। अगर मुझे सही याद है, तो समय जटिलता ओ (* एन *) है जहां * एन * स्ट्रिंग पूल का वर्तमान आकार है। –

+0

क्या यह नहीं होना चाहिए 'अगर (मिला == शून्य) '? साथ ही, लिखित रूप में, यह शायद ही धागा सुरक्षित है, भले ही 'स्ट्रिंग्स' थ्रेड-सुरक्षित डेटा संरचना है। –

1
  • के रूप में अपरिवर्तनीय जावा-स्ट्रिंग दिया जाता है, विधि धागा सुरक्षित है। आप स्ट्रिंग के रूप में उपयोग नहीं कर सकते हैं।

  • प्रलेखन वास्तव में सुझाव देता है कि यह थ्रेड-सुरक्षित है। (किसी भी के लिए पर बल द्वारा)

यह इस प्रकार है कि किसी के लिए दो तार रों और टी, s.intern() == t.intern() अगर सही है और केवल यदि रों .equals (टी) सच है।

  • तीसरे, JNI इंटरफ़ेस सी भाषा jobject रों उपयोग करता है। jstring उनमें से एक है और परिभाषा के अनुसार सभी jobject के रूप में अपरिवर्तनीय है। इस प्रकार, एक देशी सी-स्तर पर भी हम थ्रेड-सुरक्षा को संरक्षित करते हैं।

इनका नामकरण, हमारे पास यह धागा-सुरक्षित कहने के अच्छे कारण हैं।

पुनश्च: हालांकि, अगर आप ऊपर चुनौतीपूर्ण परिणामों में क्योंकि स्ट्रिंग-पूल String-class प्रति बनाए रखा है खत्म करता है, तो आप एक से अधिक वर्ग लोडर इस्तेमाल कर सकते हैं,।

A pool of strings, initially empty, is maintained privately by the class String. 
+0

'java.lang.String' केवल बूटस्ट्रैप क्लास लोडर द्वारा लोड किया जा सकता है। – irreputable

+0

@irreputable मुझे यकीन नहीं है कि आप इसे कैसे करेंगे, लेकिन अगर कोई ऐसा करता है तो इससे कोई फर्क नहीं पड़ता। – poitroae

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