2013-10-08 9 views
6

मैं परमाणु वर्गों में सेट() और तुलना एंडसेट() के बीच अंतर जानना चाहता हूं। क्या सेट() विधि परमाणु प्रक्रिया भी सुनिश्चित करती है? उदाहरण के लिए यह कोड:जावा परमाणु परिवर्तनीय सेट() बनाम तुलना एंडसेट()

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) 
    } 
} 

क्या दो विधियां समान हैं?

उत्तर

7

set और compareAndSet तरीकों अलग तरह से कार्य:

  • compareAndSet: atomically दिया अद्यतन मूल्य के लिए मूल्य सेट करता है, तो वर्तमान मूल्य (==) की उम्मीद मूल्य के बराबर है।
  • सेट: दिए गए मान पर सेट करता है।

क्या सेट() विधि परमाणु प्रक्रिया भी सुनिश्चित करती है?

हां। यह परमाणु है। क्योंकि set नया मूल्य केवल एक ही ऑपरेशन है। नीचे set विधि का स्रोत कोड है:

public final void set(long newValue) { 
     value = newValue; 
} 
+0

आपके उत्तर के लिए धन्यवाद। मैं स्रोत कोड की जांच करना भूल गया। आपको यह कहने का अधिकार है कि सेट विधि परमाणु है, लेकिन इसका कारण यह नहीं है क्योंकि इसमें केवल एक ऑपरेशन है। स्वचालित वर्गों में सदस्य चर वैल्यू कहा जाता है और वह चर अस्थिर होता है (ऊपर सेट विधि निकाय में से एक), इसलिए सेट विधि थ्रेड-सुरक्षित होना चाहिए। –

+2

क्या आप सुनिश्चित हैं कि 'परमाणु' वर्ग परमाणु हैं क्योंकि वे अपने आंतरिक राज्यों को बनाए रखने के लिए अस्थिर चर का उपयोग करते हैं। यदि आप अस्थिर चर 'अस्थिर लंबे मूल्य' को परिभाषित करते हैं, तो क्या 'मान ++' जैसे ऑपरेशन परमाणु है? और जवाब नहीं है। यह ऑपरेशन परमाणु नहीं है; यह वास्तव में तीन अलग-अलग संचालन है- मूल्य प्राप्त करें, इसमें एक जोड़ें, अपडेट किए गए मान को वापस लिखें। इस बीच, एक और धागा 'मूल्य' बदल सकता है। तो एक 'अस्थिर' चर होने पर परमाणुता की गारंटी नहीं है। एक ऑपरेशन/प्रक्रिया 'परमाणु' है, अगर वे परमाणु अद्यतनों के लिए समर्थन प्रदान करते हैं। –

+1

अब, 'सेट' ओप परमाणु है, क्योंकि इसमें केवल एक ही ऑपरेशन है: 'value = newValue; 'और परमाणु है, भले ही' मान' को' अस्थिर 'परिभाषित नहीं किया गया हो। यहां 'मूल्य' को उनके द्वारा प्रदान की जाने वाली दृश्यता गारंटी का उपयोग करने के लिए 'अस्थिर' परिभाषित किया गया था - एक थ्रेड द्वारा किए गए परिवर्तन हमेशा अन्य धागे के लिए दृश्यमान होते हैं। –

-1

जैसा कि आप नीचे खुले जेडीके कोड से देख सकते हैं।

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/concurrent/atomic/AtomicLong.java#AtomicLong.set%28long%29

set सिर्फ मान निर्दिष्ट किया जाता है और compareAndSet अतिरिक्त संचालन कर रही है atomicity सुनिश्चित करने के लिए।

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/concurrent/atomic/AtomicLong.java#AtomicLong.compareAndSet%28long%2Clong%29

वापसी मान (बुलियन) किसी भी परमाणु संचालन को डिजाइन करने के लिए विचार किया जाना चाहिए।

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