2012-08-23 46 views
5

मैं जावा 1.6 में एक वेबपैप लिख रहा हूं और इसे टॉमकैट में चला रहा हूं। जबकि मैं कोई स्पष्ट धागा नहीं कर रहा हूं, मुझे आश्चर्य है कि स्प्रिंग और टोमकैट के दृश्यों के पीछे क्या चल रहा है। क्या मैं स्ट्रिंगबफर के बजाय स्ट्रिंगबिल्डर का उपयोग कर किसी भी मुद्दे पर दौड़ूंगा?क्या मुझे वेबपैप्स के लिए स्ट्रिंगबिल्डर या स्ट्रिंगबफर का उपयोग करना चाहिए?

+0

[जावा में StringBuilder और StringBuffer] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/355089/stringbuilder-and-stringbuffer-in-java) – kosa

+0

@thinksteep यह सवाल लगता है सूत्रण किस तरह पर ध्यान केंद्रित करने वेबपैप्स में दृश्यों के पीछे होता है और यह स्ट्रिंग बिल्डिंग को कैसे प्रभावित करता है। –

+4

शायद डुप्लिकेट नहीं। ऐसा लगता है कि स्ट्रिंगबिल्डर/स्ट्रिंगबफर वर्गों की तुलना में टॉमकैट में थ्रेडिंग के बारे में अधिक सवाल है। –

उत्तर

10

यदि आप स्थानीय चर का उपयोग कर रहे हैं तो आप सुरक्षित रूप से StringBuilder का उपयोग कर सकते हैं। प्रत्येक धागे को अपना उदाहरण मिल जाएगा।

+4

+1। और यदि आप * थ्रेड के बीच स्ट्रिंग साझा कर रहे हैं (उदा। स्थिर फ़ील्ड का उपयोग करके), तो आपको शायद 'स्ट्रिंगबिल्डर' * या * स्ट्रिंगबफर 'के बजाय' स्ट्रिंग 'का उपयोग करना चाहिए। – ruakh

+3

खंडख के बिंदु पर जोर देने के लिए: धागे के बीच अपरिवर्तनीय डेटा पास करना सुरक्षित दृष्टिकोण है। –

0

यदि कोड एक सर्वलेट (डूगेट/डूपोस्ट) में है तो एकाधिक अनुरोध सर्वलेट उदाहरण बहु-थ्रेड होने का कारण बनेंगे। यदि कोड स्प्रिंग बीन में है तो यह इस बात पर निर्भर करेगा कि आपने बीन को सिंगलटन या प्रोटोटाइप के रूप में कॉन्फ़िगर किया है या नहीं।

+0

अधिक सटीक होने के लिए, आपको यह कहना चाहिए: कि सर्वलेट उदाहरण को विभिन्न ग्राहकों की सेवा करने वाले एकाधिक थ्रेड द्वारा साझा किया जा सकता है। – Razvan

+0

यह कहने का एक बेहतर तरीका है। :) –

1

आमतौर पर जावा ईई घटक डिफ़ॉल्ट रूप से थ्रेड-सुरक्षित नहीं होते हैं, इसलिए जब तक आप कोड के ब्लॉक को सिंक्रनाइज़ नहीं करते हैं, जहां आप StringBuilder का उपयोग करते हैं, तो आप दौड़-स्थितियों का अनुभव करेंगे। इसलिए, आपको या तो सिंक्रनाइज़ेशन का ख्याल रखना होगा या StringBuffer का उपयोग करना होगा।

बेशक, जैसा कि पहले से ही बताया गया है कि StringBuilder एक स्थानीय चर है, तो आपको इसके बारे में चिंता करने की ज़रूरत नहीं है।

0

स्ट्रिंगबिल्डर का उपयोग करें क्योंकि आपका निर्माता डूपोस्ट या डूगेट या अन्य में एक स्थानीय चर है। यह सच है कि एकाधिक सर्वर थ्रेड एक ही सर्वलेट उदाहरण का उपयोग करते हैं लेकिन तथ्य यह है कि आपका निर्माता स्थानीय चर है, चिंता करने का कोई कारण नहीं है! यदि आपका निर्माता आपकी सर्वलेट कक्षा का सदस्य था, तो सुनिश्चित करें कि आपको थ्रेड-सुरक्षा समस्याएं मिलेंगी। मुझे लगता है कि यह तुम्हारा मामला नहीं है।

0

जावा दस्तावेज़ java.lang.StringBuffer के बारे में कहते हैं: इस वर्ग के केवल स्ट्रिंग बफर पर सिंक्रनाइज़ करता

जब भी एक ऑपरेशन एक स्रोत अनुक्रम को शामिल होती है (जैसे के रूप में appending या एक स्रोत अनुक्रम से डालने) ऑपरेशन कर रहा है, स्रोत पर नहीं।

इसका मतलब है कि आपके स्ट्रिंगबफर पर आपके ऑपरेशन सुरक्षित होंगे भले ही आप बहु-थ्रेड वातावरण [जैसे वेब ऐप] में हों। इस तरह के स्ट्रिंगबफर उदाहरण की सुरक्षा चर के दायरे से शासित है।