मेमोरी को बचाने के लिए मैं जावा में String.intern() का उपयोग करना चाहता हूं (उसी सामग्री के साथ स्ट्रिंग के लिए आंतरिक पूल का उपयोग करें)। मैं इस विधि को विभिन्न धागे से बुलाता हूं। कोई समस्या है?String.intern() थ्रेड सुरक्षित
उत्तर
आपके प्रश्न का संक्षिप्त उत्तर हाँ है। यह धागा-सुरक्षित है।
हालांकि, आप मेमोरी खपत को कम करने के लिए इस सुविधा का उपयोग करके पुनर्विचार करना चाहेंगे। कारण यह है कि आप आंतरिक तारों की सूची से किसी भी 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;
}
}
(प्लस लॉकिंग, चूंकि ओपी थ्रेड सुरक्षा चाहता है) – CodesInChaos
आप भयानक 'इंटर्न' प्रदर्शन का भी उल्लेख कर सकते हैं। अगर मुझे सही याद है, तो समय जटिलता ओ (* एन *) है जहां * एन * स्ट्रिंग पूल का वर्तमान आकार है। –
क्या यह नहीं होना चाहिए 'अगर (मिला == शून्य) '? साथ ही, लिखित रूप में, यह शायद ही धागा सुरक्षित है, भले ही 'स्ट्रिंग्स' थ्रेड-सुरक्षित डेटा संरचना है। –
के रूप में अपरिवर्तनीय जावा-स्ट्रिंग दिया जाता है, विधि धागा सुरक्षित है। आप स्ट्रिंग के रूप में उपयोग नहीं कर सकते हैं।
प्रलेखन वास्तव में सुझाव देता है कि यह थ्रेड-सुरक्षित है। (किसी भी के लिए पर बल द्वारा)
यह इस प्रकार है कि किसी के लिए दो तार रों और टी, s.intern() == t.intern() अगर सही है और केवल यदि रों .equals (टी) सच है।
- तीसरे, JNI इंटरफ़ेस सी भाषा
jobject
रों उपयोग करता है।jstring
उनमें से एक है और परिभाषा के अनुसार सभीjobject
के रूप में अपरिवर्तनीय है। इस प्रकार, एक देशी सी-स्तर पर भी हम थ्रेड-सुरक्षा को संरक्षित करते हैं।
इनका नामकरण, हमारे पास यह धागा-सुरक्षित कहने के अच्छे कारण हैं।
पुनश्च: हालांकि, अगर आप ऊपर चुनौतीपूर्ण परिणामों में क्योंकि स्ट्रिंग-पूल String-class
प्रति बनाए रखा है खत्म करता है, तो आप एक से अधिक वर्ग लोडर इस्तेमाल कर सकते हैं,।
A pool of strings, initially empty, is maintained privately by the class String.
'java.lang.String' केवल बूटस्ट्रैप क्लास लोडर द्वारा लोड किया जा सकता है। – irreputable
@irreputable मुझे यकीन नहीं है कि आप इसे कैसे करेंगे, लेकिन अगर कोई ऐसा करता है तो इससे कोई फर्क नहीं पड़ता। – poitroae
- 1. विंडोज थ्रेड सुरक्षित और गैर-थ्रेड सुरक्षित विंडोज
- 2. सी #: थ्रेड-सुरक्षित घटनाएं
- 3. थ्रेड-सुरक्षित जीसीसी
- 4. गैर-थ्रेड-सुरक्षित
- 5. पर्ल थ्रेड सुरक्षित मॉड्यूल
- 6. थ्रेड सुरक्षित unique_ptr move
- 7. जॉइनर थ्रेड सुरक्षित है?
- 8. थ्रेड-सुरक्षित सी ++ स्टैक
- 9. ContainsKey थ्रेड सुरक्षित
- 10. थ्रेड सुरक्षित Mersenne ट्विस्टर
- 11. Magento थ्रेड-सुरक्षित है?
- 12. जावा: थ्रेड-सुरक्षित RandomAccessFile
- 13. थ्रेड सुरक्षित घटना
- 14. ऑपरेटर "=" थ्रेड सुरक्षित (सी #)
- 15. गैर थ्रेड-सुरक्षित सिंगलटन
- 16. स्ट्रीम है। थ्रेड-सुरक्षित?
- 17. थ्रेड-सुरक्षित Memoization
- 18. थ्रेड सुरक्षित गुण
- 19. java.text.SimpleDateFormat थ्रेड सुरक्षित नहीं
- 20. थ्रेड सुरक्षित रेफ गिनती
- 21. SQLite.Net थ्रेड-सुरक्षित है?
- 22. थ्रेड-सुरक्षित दिनांक पार्सर
- 23. एपोल थ्रेड-सुरक्षित है?
- 24. javax.sql.DataSource थ्रेड सुरक्षित है?
- 25. एक चर (थ्रेड) की थ्रेड-सुरक्षित सेटिंग?
- 26. अस्थायी टेबल थ्रेड-सुरक्षित हैं?
- 27. बनाना एक वर्ग थ्रेड-सुरक्षित
- 28. जावा रेगेक्स थ्रेड सुरक्षित है?
- 29. थ्रेड-सुरक्षित ByteArrayOutputStream क्या है?
- 30. क्वार्ट्ज शेड्यूलर थ्रेड सुरक्षित हैं?
अगर यह थ्रेडसेफ नहीं है तो बहुत आश्चर्यचकित होगा। वह पुस्तकालय डिजाइन में एक प्रमुख दोष होगा। – CodesInChaos
उन तारों से कहां से आते हैं? – jlordo
@jlordo - कोई स्ट्रिंग अभिव्यक्ति जो संकलन-समय स्थिर नहीं है स्वचालित रूप से आंतरिक नहीं है। तो, उदाहरण के लिए, 'नया स्ट्रिंग ("एबीसी")! = "एबीसी" '; हालांकि, '" ab "+" c "==" abc "' (इंटर्निंग के कारण)। –