1: "गैर अवरुद्ध" संगामिति क्या है और यह कैसे सामान्य संगामिति धागे का उपयोग करने से अलग है? हम उन परिदृश्यों में गैर-अवरुद्ध सहमति का उपयोग क्यों नहीं करते हैं जहां समेकन की आवश्यकता होती है? गैर-अवरुद्ध समरूपता का उपयोग करने के लिए उपर है?
गैर अवरुद्ध एल्गोरिदम योजनाओं ताला लगा स्मृति को समवर्ती पहुँच को नियंत्रित करने के लिए विशिष्ट वस्तु का उपयोग नहीं करते (सिंक्रनाइज़ और मानक वस्तु ताले उस वस्तु/समारोह स्तर ताले का उपयोग जावा में समवर्ती पहुँच समस्याओं को कम करने उदाहरण हैं। इसके बजाय इनमें से कुछ फार्म का उपयोग निम्न स्तर अनुदेश (कुछ स्तर पर) प्रदर्शन करने के लिए एक simulataneous तुलना और एक स्मृति स्थान पर अदला-बदली, अगर यह विफल रहता है यह सिर्फ झूठी वापस आती है और बाहर त्रुटि नहीं है, अगर यह तो काम करता है यह सफल रहा था और आप आगे बढ़ने आम तौर पर, यह प्रयास किया जाता है। एक लूप में जब तक यह काम नहीं करता है, क्योंकि यह विफल होने पर केवल थोड़ी सी अवधि (उम्मीद है) होगी, यह कुछ अतिरिक्त समय को तब तक लूप करेगा जब तक कि इसे स्मृति की आवश्यकता नहीं हो जाती।
यह हमेशा उपयोग नहीं होता है इसलिये यह बहुत ज्यादा भी मानक जावा तुल्यकालन की तुलना में अपेक्षाकृत तुच्छ उपयोग के मामलों के लिए एक कोड के नजरिए से जटिल है। इसके अलावा, अधिकांश के लिए उपयोग करता लॉकिंग के प्रदर्शन प्रभाव मंडल के अन्य स्रोतों की तुलना में तुच्छ है। ज्यादातर मामलों में, प्रदर्शन आवश्यकताओं को भी देखने के लिए वारंट के लिए पर्याप्त नहीं है।
अंत में, जैसा कि जेडीके/जेआरई विकसित होता है, कोर डिजाइनर कोर संरचनाओं में इन सिरों को प्राप्त करने के सबसे प्रभावी माध्यमों को शामिल करने के प्रयास में आंतरिक भाषा कार्यान्वयन में सुधार कर रहे हैं। जैसे ही आप मूल संरचनाओं से दूर चले जाते हैं, आप उन सुधारों के स्वचालित कार्यान्वयन को खो देते हैं क्योंकि आप कम मानक कार्यान्वयन का उपयोग कर रहे हैं (उदाहरण के लिए जैक्सबी/जेबीएक्स; जैक्सबी जीबीएक्स को कम करने के लिए उपयोग किया जाता है, लेकिन अब ज्यादातर मामलों में तेज़ नहीं होने पर बराबर है जब आप जावा जावा को टक्कर देते हैं तो जावा 7 के रूप में परीक्षण किया जाता है)।
यदि आप नीचे दिए गए कोड उदाहरण को देखते हैं, तो आप 'ओवरहेड' स्थानों को देख सकते हैं। यह वास्तव में ओवरहेड नहीं है, लेकिन कोड लॉकिंग के कारण गैर-लॉकिंग के काम करने के लिए बेहद कुशल होना चाहिए और वास्तव में मानक सिंक्रनाइज़ संस्करण से बेहतर प्रदर्शन करना चाहिए। यहां तक कि मामूली संशोधन भी कोड का कारण बन सकते हैं जो मानक से कोड के मुकाबले कई गुना बेहतर प्रदर्शन करने से गुजरता है जो कि कई बार खराब होता है (उदाहरण के लिए ऑब्जेक्ट इंस्टेंटेशंस जिन्हें वहां होने की आवश्यकता नहीं होती है या यहां तक कि त्वरित सशर्त जांच भी होती है; आप चक्रों को बचाने के बारे में बात कर रहे हैं यहां, इसलिए सफलता और विफलता के बीच का अंतर बहुत पतला है)।
2: मैंने सुना है कि जावा में गैर-अवरुद्ध समरूपता उपलब्ध है। क्या कोई विशेष परिदृश्य है जहां हमें इस सुविधा का उपयोग करना चाहिए?
मेरी राय में आपको केवल इसका उपयोग करना चाहिए यदि आप ए) उत्पादन में अपने चल रहे सिस्टम में अपने उत्पादन हार्डवेयर पर एक सिद्ध प्रदर्शन समस्या है; और बी) यदि आप साबित कर सकते हैं कि महत्वपूर्ण खंड में छोड़ी गई एकमात्र अक्षमता संबंधित लॉकिंग है; सी) आपके पास अपने हितधारकों से दृढ़ता से खरीददारी है कि वे प्रदर्शन सुधार के बदले में गैर-मानक कम रखरखाव कोड तैयार करने के इच्छुक हैं जो आपको चाहिए) अपने उत्पादन हार्डवेयर पर संख्यात्मक रूप से साबित करें कि यह निश्चित रूप से भी मददगार होगा।
3: क्या संग्रह के साथ इन तरीकों में से किसी एक का उपयोग करने में कोई अंतर या लाभ है? ट्रेड-ऑफ क्या हैं?
लाभ प्रदर्शन है, व्यापार बंद पहले कि यह अधिक विशिष्ट कोड है (इतने सारे डेवलपर्स क्या इसके बारे में बनाने के लिए पता नहीं है है, एक नई टीम या नए भाड़े के लिए यह कठिन गति के लिए आने के लिए, याद रखें कि सॉफ्टवेयर की अधिकांश लागत श्रम है, इसलिए आपको डिजाइन निर्णयों के माध्यम से लगाए गए स्वामित्व की कुल लागत देखना होगा), और यह सुनिश्चित करने के लिए कि निर्माण अभी भी वास्तव में तेज़ है, किसी भी संशोधन का फिर से परीक्षण किया जाना चाहिए। आम तौर पर ऐसी प्रणाली में जिसके लिए कुछ प्रदर्शन या लोड और थ्रूपुट परीक्षण की आवश्यकता होती है, किसी भी बदलाव के लिए आवश्यक होगा। यदि आप इन परीक्षणों को नहीं कर रहे हैं तो मैं तर्क दूंगा कि आपको निश्चित रूप से इन दृष्टिकोणों के बारे में भी सोचने की आवश्यकता नहीं है, और लगभग निश्चित रूप से बढ़ी जटिलता के लिए कोई मूल्य नहीं दिखता है (यदि आपको यह सब सही काम करने के लिए मिला है)।
फिर से, मुझे केवल अनुकूलन के खिलाफ सभी मानक चेतावनियों को पुन: स्थापित करना होगा, क्योंकि इनमें से कई तर्क समान हैं कि मैं इसे एक डिजाइन के रूप में उपयोग करूंगा। इसके लिए कई कमीएं किसी भी अनुकूलन के समान होती हैं, उदाहरण के लिए, जब भी आप यह कोड सुनिश्चित करते हैं कि आपका 'फिक्स' कुछ निर्माण में अक्षमता का परिचय नहीं देता है जिसे केवल प्रदर्शन में सुधार करने के लिए रखा गया था, और इसके साथ सौदा किया गया था अगर फिक्स महत्वपूर्ण है और यह प्रदर्शन को कम करता है तो (संपूर्ण अनुभाग को संभावित रूप से ऑप्टिमाइज़ेशन को हटाने के लिए) का अर्थ है।
वास्तव में यह वास्तव में गड़बड़ करना बहुत मुश्किल है, जो इसे डीबग करना बहुत मुश्किल है, इसलिए यदि आपको ऐसा करने की ज़रूरत नहीं है (जिसे मैंने केवल कुछ परिदृश्य पाए हैं जहां आप कभी भी करेंगे; और मेरे लिए वे बहुत संदिग्ध थे और मैं इसे नहीं करना चाहूंगा) ऐसा मत करो। मानक सामान का उपयोग करें और हर कोई खुश होगा!
चर्चा/कोड
गैर अवरुद्ध या मुफ्त संगामिति ताला विशिष्ट वस्तु ताले साझा स्मृति का उपयोग (सिंक्रनाइज़ ब्लॉक या विशिष्ट ताले की तरह) को नियंत्रित करने के से दूर रहता है। कोड अनुभाग गैर-लॉकिंग होने पर एक प्रदर्शन लाभ होता है; तथापि, कैस पाश में कोड (यदि इस तरह से तुम जाओ है, वहाँ जावा में अन्य तरीके हैं) बहुत, बहुत कुशल होना चाहिए या इस से आपको अधिक निष्पादन की लागत की तुलना में आप लाभ खत्म हो जाएगा।
सभी प्रदर्शन अनुकूलन की तरह, अतिरिक्त जटिलता सबसे उपयोग के मामलों के लिए प्रभाव के लायक नहीं है। मानक संरचनाओं का उपयोग करके स्पष्ट रूप से लिखित जावा भी सबसे अनुकूलन से बेहतर नहीं होगा (और वास्तव में आपके संगठन को जाने के बाद सॉफ़्टवेयर को अधिक आसानी से बनाए रखने की अनुमति देता है)। मेरे दिमाग में यह केवल सिद्ध प्रदर्शन मुद्दों के साथ बहुत उच्च प्रदर्शन खंडों में समझ में आता है जहां लॉकिंग अक्षमता का एकमात्र स्रोत है। आप निश्चित रूप से एक जाना जाता है और मात्रा निर्धारित किया प्रदर्शन समस्या नहीं है, तो मैं इस तरह किसी भी तकनीक के उपयोग जब तक आप सिद्ध कर दिया है समस्या लॉकिंग की वजह से वास्तव में नहीं है और कोड की दक्षता के साथ अन्य मुद्दों के लिए क्या नहीं बच जाएंगे। एक बार जब आप एक सिद्ध ताला आधारित प्रदर्शन समस्या है मैं यह सुनिश्चित करना होगा कि आप यह सुनिश्चित करें कि इस प्रकार के सेटअप वास्तव में सिर्फ मानक जावा संगामिति का उपयोग करने से आप के लिए तेजी से चलाने के लिए जा रहा है जगह में मीट्रिक के कुछ प्रकार है।
कार्यान्वयन है कि मैं इस प्रयोग कैस संचालन और चर के परमाणु परिवार के लिए किया है। इस मूल कोड ने इस उपयोग मामले में मेरे लिए किसी भी त्रुटि को लॉक या उठाया नहीं है (यादृच्छिक नमूना इनपुट और उच्च माध्यमिक अनुवाद प्रणाली से ऑफ़लाइन परीक्षण के लिए आउटपुट)। यह मूल रूप से इस तरह काम करता है:
आपके पास कुछ वस्तु है जो धागे के बीच साझा की जाती है, और इसे या तो एटमिकXXक्स या परमाणु संदर्भ के रूप में घोषित किया जाता है (अधिकांश गैर-तुच्छ उपयोग के मामलों के लिए आप परमाणु संदर्भ संस्करण के साथ भाग लेंगे)।
जब दिए गए मूल्य/ऑब्जेक्ट का संदर्भ दिया है, आप इसे परमाणु आवरण से पुनः प्राप्त, यह आप एक स्थानीय प्रति जिस पर आप कुछ संशोधन प्रदर्शन हो जाता है। यहाँ से आप अपने धागे से इस परमाणु स्थापित करने के लिए अगर यह विफल रहता है यह गलत रिटर्न के रूप में ताला लगा के लिए विरोध प्रयास करने के लिए थोड़ी देर के पाश की शर्त के रूप में एक compareAndSwap का उपयोग करें। यह तब तक सक्रिय होगा जब तक यह काम नहीं करता है (इस लूप में कोड बहुत ही कुशल और सरल होना चाहिए)।
आप सीएएस ऑपरेशंस को देख सकते हैं कि वे कैसे काम करते हैं, यह मूल रूप से एक निर्देश के रूप में लागू किया जाना चाहिए ताकि यह देखने के लिए अंत में तुलना की जा सके कि मूल्य क्या है जिसे आपने इसे सेट करने का प्रयास किया है।
compareAndSwap में विफल रहता है, तो आप अपने वस्तु फिर से परमाणु आवरण से, प्राप्त किसी भी संशोधन को फिर से, और फिर तुलना और स्वैप फिर से जब तक यह काम करता है की कोशिश करो। कोई विशेष ताला तुम सिर्फ वस्तु स्मृति में वापस स्थापित करने के लिए कोशिश कर रहे हैं और अगर यह विफल रहता है तो आप सिर्फ फिर से जब भी आपके धागा फिर से नियंत्रण हो जाता है की कोशिश भी है।
/* field declaration*/
//Note that I have an initialization block which ensures that the object in this
//reference is never null, this was required to remove null checks and ensure the CAS
//loop was efficient enough to improve performance in my use case
private AtomicReference<List<SampleRuleMessage>> specialSamplingRulesAtomic = new AtomicReference<List<SampleRuleMessage>>();
/*start of interesting code section*/
List<SampleRuleMessage> list = specialSamplingRulesAtomic.get();
list.add(message);
while(!specialSamplingRulesAtomic.compareAndSet(specialSamplingRulesAtomic.get(), list)){
list = specialSamplingRulesAtomic.get();
list.add(message);
};
/* end of interesting code section*/
कुछ जानकारी यहाँ http://en.wikipedia.org/wiki/Non-blocking_synchronization – Dimitar
क्या आप मतलब है आपका पहला सवाल, आप गैर-अवरुद्ध समवर्तीता की तुलना में वास्तव में क्या कर रहे हैं? –
निजी अंतिम ArrayList सूची = संग्रह। सिंक्रनाइज़मैप() दो कारणों से संकलित नहीं होगा ... –
harschware