मैं परमाणु वर्गों में सेट() और तुलना एंडसेट() के बीच अंतर जानना चाहता हूं। क्या सेट() विधि परमाणु प्रक्रिया भी सुनिश्चित करती है? उदाहरण के लिए यह कोड:जावा परमाणु परिवर्तनीय सेट() बनाम तुलना एंडसेट()
public class sampleAtomic{
private static AtomicLong id = new AtomicLong(0);
public void setWithSet(long newValue){
id.set(newValue);
}
public void setWithCompareAndSet(long newValue){
long oldVal;
do{
oldVal = id.get();
}
while(!id.compareAndGet(oldVal,newValue)
}
}
क्या दो विधियां समान हैं?
आपके उत्तर के लिए धन्यवाद। मैं स्रोत कोड की जांच करना भूल गया। आपको यह कहने का अधिकार है कि सेट विधि परमाणु है, लेकिन इसका कारण यह नहीं है क्योंकि इसमें केवल एक ऑपरेशन है। स्वचालित वर्गों में सदस्य चर वैल्यू कहा जाता है और वह चर अस्थिर होता है (ऊपर सेट विधि निकाय में से एक), इसलिए सेट विधि थ्रेड-सुरक्षित होना चाहिए। –
क्या आप सुनिश्चित हैं कि 'परमाणु' वर्ग परमाणु हैं क्योंकि वे अपने आंतरिक राज्यों को बनाए रखने के लिए अस्थिर चर का उपयोग करते हैं। यदि आप अस्थिर चर 'अस्थिर लंबे मूल्य' को परिभाषित करते हैं, तो क्या 'मान ++' जैसे ऑपरेशन परमाणु है? और जवाब नहीं है। यह ऑपरेशन परमाणु नहीं है; यह वास्तव में तीन अलग-अलग संचालन है- मूल्य प्राप्त करें, इसमें एक जोड़ें, अपडेट किए गए मान को वापस लिखें। इस बीच, एक और धागा 'मूल्य' बदल सकता है। तो एक 'अस्थिर' चर होने पर परमाणुता की गारंटी नहीं है। एक ऑपरेशन/प्रक्रिया 'परमाणु' है, अगर वे परमाणु अद्यतनों के लिए समर्थन प्रदान करते हैं। –
अब, 'सेट' ओप परमाणु है, क्योंकि इसमें केवल एक ही ऑपरेशन है: 'value = newValue; 'और परमाणु है, भले ही' मान' को' अस्थिर 'परिभाषित नहीं किया गया हो। यहां 'मूल्य' को उनके द्वारा प्रदान की जाने वाली दृश्यता गारंटी का उपयोग करने के लिए 'अस्थिर' परिभाषित किया गया था - एक थ्रेड द्वारा किए गए परिवर्तन हमेशा अन्य धागे के लिए दृश्यमान होते हैं। –