नकली तौर पर: किसी स्पष्ट कारण
के लिए atomic
पैकेज जावाडोक के अनुसार:
परमाणु कक्षाएं भी विधि weakCompareAndSet, जो प्रयोज्यता सीमित है समर्थन करते हैं।
कुछ प्लेटफार्मों पर, कमजोर संस्करण सामान्य मामले में compareAndSet तुलना में अधिक कुशल हो सकता है लेकिन अलग है कि में weakCompareAndSet विधि के किसी भी मंगलाचरण नकली तौर पर झूठी वापस आ सकते हैं (जो है, किसी स्पष्ट कारण के लिए)।
एक झूठी वापसी का मतलब केवल ऑपरेशन को वांछित होने पर पुनः प्रयास किया जा सकता है, गारंटी पर भरोसा करते हैं कि चर आवंटित होने पर आवंटन बार-बार किया जाता है। वैल्यू और कोई अन्य थ्रेड वैरिएबल सेट करने का भी प्रयास नहीं कर रहा है।
(उदाहरण के लिए ऐसी नकली विफलताओं मेमोरी विवाद प्रभावों के कारण हो सकती हैं जो अपेक्षित और वर्तमान मान बराबर हैं या नहीं।)
इसके अतिरिक्त कमजोर कॉम्पारेयर एंडसेट ऑर्डर गारंटी प्रदान नहीं करता है जो आमतौर पर सिंक्रनाइज़ेशन नियंत्रण के लिए आवश्यक होते हैं।
this thread के अनुसार, यह इसलिए है क्योंकि "हार्डवेयर/ओएस" के ज्यादा नहीं है, लेकिन मूल weakCompareAndSet द्वारा प्रयोग किया जाता एल्गोरिथ्म की वजह से:
weakCompareAndSet atomically के लिए मूल्य सेट अद्यतन मूल्य दिया गया है यदि वर्तमान मूल्य == अपेक्षित मूल्य। उग्र रूप से असफल हो सकता है।
compareAndSet(), और अन्य कार्यों एक AtomicX पर, विपरीत weakCompareAndSet() आपरेशन किसी भी happens-before orderings नहीं बनाता है।
इस प्रकार, सिर्फ इसलिए कि एक धागा एक अद्यतन एक weakCompareAndSet की वजह से मतलब यह नहीं है यह ठीक से कार्य है कि weakCompareAndSet से पहले हो गई() के साथ सिंक्रनाइज़ है एक AtomicX को देखता है।
शायद आप इस विधि का उपयोग नहीं करना चाहते हैं, लेकिन इसके बजाय तुलना करें औरसेट का उपयोग करना चाहिए; क्योंकि ऐसे कुछ मामले हैं जहां कमजोर कॉम्पैयर एंडसेट तुलना की तुलना में तेज़ है औरसेट, और ऐसे कई मामले हैं जिनमें तुलना करने के बजाए कमजोर कॉम्पैयर एंडसेट का उपयोग करके अपने कोड को अनुकूलित करने का प्रयास किया जा रहा है। एंडसेट आपके कोड में सिंक्रनाइज़ेशन त्रुटियों को पुन: उत्पन्न करने के लिए सूक्ष्म और कठिन परिचय देगा।
नोट happens-before orderings के बारे में:
जावा मेमोरी मॉडल (झामुमो) की स्थिति है जिसके तहत एक धागा एक चर पढ़ने एक और धागा में लिखने के परिणाम देखने के लिए गारंटी है परिभाषित करता है ।
जेएमएम एक कार्यक्रम के संचालन पर एक आदेश को परिभाषित करता है जिसे पहले होता है।
होता है-थ्रेड में ऑर्डर करने से पहले केवल एक सामान्य लॉक पर सिंक्रनाइज़ करके या एक सामान्य अस्थिर चर का उपयोग करके बनाया जाता है।
किसी ऑर्डर-ऑर्डर करने की अनुपस्थिति में, जावा प्लेटफॉर्म में ऑर्डर देरी या परिवर्तन करने के लिए बहुत अक्षांश है जिसमें एक थ्रेड में लिखना एक ही चर के दूसरे दृश्य को पढ़ने के लिए दिखाई देता है।
जेएमएम (जावा मेमोरी मॉडल) में ऑर्डर से पहले होने वाले तकनीकी कारणों में बस तकनीकी कारण जोड़ा गया – VonC