2008-12-10 9 views
17

जावा AtomicInteger वर्ग एक विधि है -परमाणु इंटेगर पर "नकली विफलता" कमजोर क्या है और इसका मतलब है?

boolean weakCompareAndSet(int expect,int update) 

इसके documnentation का कहना है:

नकली तौर पर विफल हो सकता है।

यहां 'उग्रता से असफल' क्या मतलब है?

उत्तर

6

इसका मतलब है कि यह गलत वापस कर सकती है (और नए मान सेट नहीं होगा) तो भी यह वर्तमान में उम्मीद मूल्य में शामिल है।

दूसरे शब्दों में, विधि कुछ भी नहीं है और किसी स्पष्ट कारण के झूठे वापस आ सकते हैं ...
जहां इस एक मजबूत CompareAndSet() से अधिक प्रदर्शन लाभ हो सकता है सीपीयू आर्किटेक्चर रहे हैं।


कुछ ऐसा क्यों हो सकता है इस पर कुछ और ठोस विवरण।

कुछ आर्किटेक्चर (नए हथियार की तरह) एक लोड लिंक्ड (एलएल)/स्टोर सशर्त (अनुसूचित जाति) निर्देश के सेट का उपयोग कैस संचालन को लागू। एलएल निर्देश स्मृति को स्मृति स्थान में लोड करता है और कहीं भी पता याद करता है। एससी निर्देश उस स्मृति स्थान में एक मान संग्रहीत करता है यदि याद किए गए पते पर मूल्य संशोधित नहीं किया गया है। यह संभव है हार्डवेयर पर विश्वास करने के लिए स्थान को संशोधित किया गया है कि भले ही वह जाहिरा तौर पर संभावित कारणों की एक संख्या के लिए नहीं है (और कारणों CPU वास्तुकला से भिन्न हो सकता है):

  1. स्थान के साथ लिखा गया हो सकता है एक ही मूल्य
  2. पतों देखा हित के ठीक एक स्मृति स्थान नहीं हो सकता है के संकल्प (लगता है कैश लाइनों)। संदर्भ स्विच - किसी अन्य स्थान पर एक लिखने है कि 'क्लोज-से' फ्लैग करने के लिए हार्डवेयर 'गंदा'
  3. कि सीपीयू डालूँगा शिक्षा का बचाया राज्य नष्ट हो सकते हैं अन्य कारणों की एक संख्या के रूप में प्रश्न में पता कारण हो सकता है , कैश फ्लश, या पेज टेबल शायद बदल सकता है।
18

नकली तौर पर: किसी स्पष्ट कारण

के लिए atomic पैकेज जावाडोक के अनुसार:

परमाणु कक्षाएं भी विधि weakCompareAndSet, जो प्रयोज्यता सीमित है समर्थन करते हैं।

कुछ प्लेटफार्मों पर, कमजोर संस्करण सामान्य मामले में compareAndSet तुलना में अधिक कुशल हो सकता है लेकिन अलग है कि में weakCompareAndSet विधि के किसी भी मंगलाचरण नकली तौर पर झूठी वापस आ सकते हैं (जो है, किसी स्पष्ट कारण के लिए)।

एक झूठी वापसी का मतलब केवल ऑपरेशन को वांछित होने पर पुनः प्रयास किया जा सकता है, गारंटी पर भरोसा करते हैं कि चर आवंटित होने पर आवंटन बार-बार किया जाता है। वैल्यू और कोई अन्य थ्रेड वैरिएबल सेट करने का भी प्रयास नहीं कर रहा है।
(उदाहरण के लिए ऐसी नकली विफलताओं मेमोरी विवाद प्रभावों के कारण हो सकती हैं जो अपेक्षित और वर्तमान मान बराबर हैं या नहीं।)

इसके अतिरिक्त कमजोर कॉम्पारेयर एंडसेट ऑर्डर गारंटी प्रदान नहीं करता है जो आमतौर पर सिंक्रनाइज़ेशन नियंत्रण के लिए आवश्यक होते हैं।


this thread के अनुसार, यह इसलिए है क्योंकि "हार्डवेयर/ओएस" के ज्यादा नहीं है, लेकिन मूल weakCompareAndSet द्वारा प्रयोग किया जाता एल्गोरिथ्म की वजह से:

weakCompareAndSet atomically के लिए मूल्य सेट अद्यतन मूल्य दिया गया है यदि वर्तमान मूल्य == अपेक्षित मूल्य। उग्र रूप से असफल हो सकता है।

compareAndSet(), और अन्य कार्यों एक AtomicX पर, विपरीत weakCompareAndSet() आपरेशन किसी भी happens-before orderings नहीं बनाता है।

इस प्रकार, सिर्फ इसलिए कि एक धागा एक अद्यतन एक weakCompareAndSet की वजह से मतलब यह नहीं है यह ठीक से कार्य है कि weakCompareAndSet से पहले हो गई() के साथ सिंक्रनाइज़ है एक AtomicX को देखता है।

शायद आप इस विधि का उपयोग नहीं करना चाहते हैं, लेकिन इसके बजाय तुलना करें औरसेट का उपयोग करना चाहिए; क्योंकि ऐसे कुछ मामले हैं जहां कमजोर कॉम्पैयर एंडसेट तुलना की तुलना में तेज़ है औरसेट, और ऐसे कई मामले हैं जिनमें तुलना करने के बजाए कमजोर कॉम्पैयर एंडसेट का उपयोग करके अपने कोड को अनुकूलित करने का प्रयास किया जा रहा है। एंडसेट आपके कोड में सिंक्रनाइज़ेशन त्रुटियों को पुन: उत्पन्न करने के लिए सूक्ष्म और कठिन परिचय देगा।


नोट happens-before orderings के बारे में:

जावा मेमोरी मॉडल (झामुमो) की स्थिति है जिसके तहत एक धागा एक चर पढ़ने एक और धागा में लिखने के परिणाम देखने के लिए गारंटी है परिभाषित करता है ।

जेएमएम एक कार्यक्रम के संचालन पर एक आदेश को परिभाषित करता है जिसे पहले होता है।

होता है-थ्रेड में ऑर्डर करने से पहले केवल एक सामान्य लॉक पर सिंक्रनाइज़ करके या एक सामान्य अस्थिर चर का उपयोग करके बनाया जाता है।

किसी ऑर्डर-ऑर्डर करने की अनुपस्थिति में, जावा प्लेटफॉर्म में ऑर्डर देरी या परिवर्तन करने के लिए बहुत अक्षांश है जिसमें एक थ्रेड में लिखना एक ही चर के दूसरे दृश्य को पढ़ने के लिए दिखाई देता है।

0

लेकिन ऐसा क्यों होने की अनुमति है? क्या ऐसा इसलिए है क्योंकि हार्डवेयर/ओएस नीचे छोटी है? या इसके पीछे कुछ अच्छा तकनीकी कारण है?

+0

जेएमएम (जावा मेमोरी मॉडल) में ऑर्डर से पहले होने वाले तकनीकी कारणों में बस तकनीकी कारण जोड़ा गया – VonC

6

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

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