2015-04-27 12 views
5

मेरे पास कक्षा "RequestContext" है जिसमें request का दायरा है। इस वर्ग ने listOfItem को योगदान दिया है।अनुरोध स्कोप का उपयोग करते समय थ्रेड सुरक्षित कोड

अब मेरे पास MyMapper है जहां मुझे इस सूची का उपयोग करने की आवश्यकता है। अब जब मैं listOfItems चाहता हूं तो मैं हमेशा context.getListOfItem() पर कॉल करता हूं लेकिन समस्या यह है कि मेरे पास बहुत सारी निजी विधि है जहां मुझे इसे कई बार दोहराना होगा। यह ठीक है जब मैं कन्स्ट्रक्टर में इस योगदान को परिभाषित करता हूं? यह सुरक्षित थ्रेड है:

public abstract class MyMapper{ 

@Autowired 
protected RequestContext context; 

private final List<String> listOfItem; 

public MyMapper() { 
    this.listOfItem = context.getListOfItem(); // is this thread safe and ok ? 
} 

public Object map(Object entity){ 

} 

} 

उत्तर

1

हाँ, वह सुरक्षित धागा रूप में लंबे समय के रूप में यह एक प्रोटोटाइप गुंजाइश सेम रूप में घोषित किया जाता है, और आप एक init() विधि है कि वसंत से पुकारा जाता है बनाने की जरूरत:

@PostConstruct 
public void init() { 
    listOfItem = context.getListOfItem(); 
} 

अनुरोध कॉन्टेक्स्ट केवल एक थ्रेड (अनुरोध को संभालने के लिए आवंटित एक) से ही सुलभ है, कन्स्ट्रक्टर ऑब्जेक्ट के निर्माण की प्रकृति की प्रकृति द्वारा फिर से प्रवेश नहीं कर रहा है।

सावधान listOfItem किसी भी तरह हालांकि reentrancy समस्याओं से सुरक्षित किया जा रहा है के साथ इस भ्रमित करने के लिए नहीं हो सकता है, सिर्फ इसलिए कि यह MyMapper वस्तु में नीचे बंद कर दिया है एक गेटर द्वारा साझा किए जाने से यह बंद नहीं होता, अगर एक उपलब्ध थे (वहाँ isn ' आपके मामले में टी)। मैं यह भी देखता हूं कि यह एक अमूर्त वर्ग है, लेकिन listOfItem निजी है, इसलिए उप-वर्गों तक इसका उपयोग नहीं होगा। उस सूची के किसी भी लीक किए गए संदर्भ को समवर्ती धागे द्वारा छेड़छाड़ की जा सकती है, संदर्भ के किसी भी प्रतियां होने के कारण (List एस जावा में उत्परिवर्तनीय हैं)।

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

यह बहुत साफ दिखता है! अच्छा काम करते रहें।

+1

एचएम लेकिन ऑटोवॉयरिंग होने पर संदर्भ शून्य नहीं है? – hudi

+0

हां, यह सही है, मैं अपना जवाब अपडेट करूंगा। (मैं पिछले कुछ सालों से स्कैला कर रहा हूं ...) –

+0

यदि वसंत द्वारा इनिट विधि को बुलाया जाता है, तो क्या यह एक ही समस्या को नहीं दबाएगा? या आप सुझाव दे रहे हैं कि कक्षा सिंगलटन गुंजाइश में नहीं होनी चाहिए? – eis

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