ServletContext#setAttribute
के माध्यम से प्रकाशन विशेषताओं थ्रेड-सुरक्षित है! यह जावा सर्वलेट विशिष्टता, अध्याय 4.5: (...) से प्राप्त किया जा सकता है किसी भी विशेषता किसी संदर्भ में किसी भी अन्य सर्वलेट के लिए उपलब्ध है जो उसी वेब एप्लिकेशन का हिस्सा है। (...)।
(कारण: अन्य सर्लेट्स के लिए उपलब्ध वस्तुओं को बनाने का मतलब है कि उन्हें अन्य धागे के लिए भी उपलब्ध कराया जाए। यह केवल तभी संभव है जब उचित सिंक्रनाइज़ेशन का उपयोग किया जाए, इसलिए ServletContext#setAttribute
के लिए सिंक्रनाइज़ेशन अनिवार्य है)।
तो ServletContext#getAttribute
के माध्यम से प्रकाशित विशेषताओं को पढ़ने के लिए भी यही सच है।
लेकिन निश्चित रूप से अगर एक HashMap
की तरह एक वस्तु अलग धागे के बीच साझा किया जाता है, डेवलपर सुनिश्चित करना चाहिए कि इस साझा वस्तु अपने आप में एक उचित, धागा सुरक्षित तरीके से एक्सेस किया जाता है!इसलिए
ConcurrentMap<String, Object> shared = (...)servletContext.getAttribute("sharedData");
if (shared == null) {
shared = new ConcurrentHashMap<>();
servletContext.setAttribute("sharedData", shared);
}
, एक: एक ConcurrentHashMap
के रूप में पहले से ही अपने प्रश्न का अन्य उत्तर में कहा गया है का उपयोग करना, एक संभव समाधान, के रूप में null
जांच परमाणु नहीं होगा, लेकिन रेस स्थिति जब विशेषता आरंभ नहीं हो जाता समाधान नहीं करता है वेब अनुप्रयोग शुरू होने पर संदर्भ को आरंभ करने के लिए ServletContextListener
का उपयोग किया जा सकता है!
क्या आपने TreeMap को आजमाया था? – Prateek
क्या आप अपना कोड डाल सकते हैं? –