शीर्षक के रूप में, मैं एक तुलना और स्वैप लागू करने के लिए देख रहा हूँ पता चलता है, लेकिन साथ अधिक से अधिक तुलना:अधिक से अधिक तुलना और स्वैप
if(newValue > oldValue) {
oldValue = newValue;
}
जहां oldValue
कुछ वैश्विक साझा राज्य है क्योंकि मैं एक गैर अवरुद्ध समाधान चाहते हैं
synchronized(locker) {
if(newValue > oldValue) {
oldValue = newValue;
}
}
: और newValue
प्रत्येक थ्रेड के लिए निजी है, ऐसा किए बिना। अन्य गैर अवरुद्ध आपरेशन के स्रोत कोड का अध्ययन से, मैं (यह मानते हुए मान पूर्णांक हैं) इस के साथ आ गया है:
AtomicInteger oldValue; // shared global variable
...
public boolean GreaterThanCAS(int newValue) {
while(true) {
int local = oldValue;
if(local == oldValue) {
if(newValue > local) {
if(oldValue.compareAndSet(local, newValue) {
return true; // swap successful
} // else keep looping
} else {
return false; // swap failed
}
} // else keep looping
}
}
जब // else keep looping
होता है, इसका मतलब है कि एक और धागा बदल गया है इस बीच में oldValue
और इसलिए मुझे लूप करने की ज़रूरत है और पुनः प्रयास करें।
क्या यह कार्यान्वयन सही है (धागा-सुरक्षित)?
यह केवल देखने के लिए जाँच कर रहा है, तो धागा स्विचिंग 'local' चर बताए और देखने के लिए जाँच के बीच हुई अगर वे वही हैं। आपके कथन के बाद थ्रेड स्विचिंग हो सकती है। तो नहीं, यह धागा सुरक्षित नहीं है, लेकिन अवरुद्ध किए बिना मुझे यकीन नहीं है कि आपको कोई समाधान मिलेगा। – Shaded
@ छायांकित: 'oldValue.compareAndSwap (स्थानीय, newValue) 'कॉल भी गलत लौटाता है यदि' oldValue' 'स्थानीय' के बराबर नहीं है, इसलिए यह यहां भी जांचता है। – Tudor
आपको पहले समानता तुलना की आवश्यकता नहीं है। बस "अगर (newValue> स्थानीय) oldValue.CAS (स्थानीय, newValue) और दोहराना" पर्याप्त – BegemoT