2016-01-26 11 views
5

मैं Mojarra 2.2.12 उपयोग कर रहा हूँ में कामयाब रहे और हमारे परियोजना में हम कुछ @ApplicationScoped सेम मिल गया है। उदाहरण के लिए:कन्करेंसी सेम

@ManagedBean 
@ApplicationScoped 
public class AppScopedBean{ 

    private int commonValueForClients; 

    //GET, SET 

    public void evalNew(){ 
     int newCommonVal; 
     //Evaluation of the new value, doesn't depend on the commonValueForClients 
     commonValueForClients = newCommonVal; 
    } 
} 

मेरा प्रश्न हमें नए निर्दिष्ट मूल्य की दृश्यता के बारे में चिंता करनी चाहिए?

मुझे the spec में नहीं मिला था कि जेएसएफ बुनियादी ढांचे को @ApplicationScoped बीन फ़ील्ड तक पहुंच सिंक्रनाइज़ करना होगा। तो, विशेष रूप से मोज़रा 2.2.12 के लिए, क्या हमें क्षेत्र को volatile के रूप में घोषित करना चाहिए या स्पष्ट रूप से इसका उपयोग सिंक्रनाइज़ करना चाहिए?

+0

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

+0

@ टिनी शायद, कैशिंग कड़ाई से प्रबंधित बीन्स के लिए उपयुक्त नहीं बोल रहा है, मुझे लगता है। यह एक सेवा उद्देश्य है। –

उत्तर

8

जेएसएफ किसी भी दायरे में प्रबंधित सेम तक किसी भी पहुंच को सिंक्रनाइज़ नहीं करता है।

आपकी जिम्मेदारी है कि। फ़ील्ड प्रकार इस तरह के AtomicInteger, ConcurrentHashMap, Collections#synchronizedList(), आदि के रूप volatile के रूप में ही अंतिम उपाय का प्रयोग करता है, तो ऐसी कोई आवरण मौजूद ही मौजूदा संगामिति/तुल्यकालन रैपर का प्रयोग करें।

परिवर्तनशील वस्तुओं के तुल्यकालन निश्चित रूप से आवश्यक में आवेदन सेम scoped है। उदाहरण के मामले में HashMap, आप अन्यथा stuck thread (100% CPU) को भी जोखिम दे सकते हैं। यह कम अत्यंत आवश्यक होता है में सत्र सेम scoped के रूप में वे केवल तक नहीं पहुंचा जाएगा समवर्ती जब enduser एक ही सत्र पर एक से अधिक HTTP कनेक्शन खोलता है, और इस by default केवल होगा जब दो शारीरिक रूप से अलग ब्राउज़र उदाहरणों पैदा की हैं, लेकिन वे करेंगे डिफ़ॉल्ट रूप से बदले में पहले ही सत्र साझा नहीं कर रहा है। तो यह केवल रोबोट/हैकर्स के मामले में होता है और इसलिए इसे सत्र स्कोप्ड बीन्स में भी इसकी देखभाल करने की दृढ़ता से अनुशंसा की जाती है। यह दृश्य में सेम scoped के रूप में ajax अनुरोध by specification पंक्तिबद्ध हैं, लेकिन PrimeFaces में यह <p:ajax async="true"> द्वारा बंद किया जा सकता है, और आप ध्यान में रखते हुए कि लेने के लिए खाते में होगा और साथ ही सेम scoped लगभग अनावश्यक है। स्कोप्ड बीन्स के अनुरोध में यह पूरी तरह से अनावश्यक है।

यदि आपके हाथों में सीडीआई होता है, तो आप वैकल्पिक रूप से ईजेबी के @Lock एनोटेशन को एक कस्टम एनोटेशन और सीडीआई इंटरसेप्टर के साथ नकल कर सकते हैं। यह स्टीफन किंटेलियस के ब्लॉग में विस्तृत है: Concurrency control for CDI, संयोग से आपके प्रश्न से पहले दिन पोस्ट किया गया। ध्यान रखें कि जेएसएफ बीन प्रबंधन सुविधा जेएसएफ 2.3 के अनुसार सीडीआई के पक्ष में बहिष्कृत है। यह भी देखें Backing beans (@ManagedBean) or CDI Beans (@Named)? यदि आप कर सकते हैं, तो बीडी प्रबंधन के रूप में सीडीआई में जाएं।

+0

दिलचस्प है, लेकिन कल्पना इसके बारे में बिल्कुल स्पष्ट नहीं है। क्या यह कार्यान्वयन के लिए इसे सिंक्रनाइज़ करना संभव है ...? मेरा मतलब है, oversyncrhonization से बचने के लिए और perfomance sakes के लिए कुछ impl-विशिष्ट विशेषताओं का उपयोग करें। –

+0

_ अगर कोई ऐसा रैपर मौजूद नहीं है तो अस्थिर केवल अंतिम उपाय के रूप में उपयोग करें ._ आप ऐसा क्यों सोचते हैं? मैंने सोचा था कि अपरिवर्तनीय वस्तुओं के साथ संयुक्त अस्थिर क्षेत्र थ्रेड-सुरक्षा के लिए एक stnadrd तकनीक है। –

+0

कार्यान्वयन वास्तव में ऐसा करने का विकल्प चुन सकता है, लेकिन यह सादा अपर्याप्त होगा क्योंकि सिंक्रनाइज़ेशन हमेशा आवश्यक नहीं होता है। आवश्यकता बीन वर्ग डिजाइन पर निर्भर करती है और यह कार्यान्वयन से अदृश्य है। 'अस्थिर' के रूप में, उन रैपर अपरिवर्तनीय नहीं हैं। – BalusC

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