जावा में कौन से ऑपरेशन परमाणु माने जाते हैं?


जवाबों:


100
  • लंबे और दोहरे को छोड़कर आदिम प्रकार के सभी असाइनमेंट
  • संदर्भ के सभी कार्य
  • अस्थिर चर के सभी कार्य
  • java.concurrent.Atomic * कक्षाओं के सभी संचालन

और शायद कुछ और। जैल को देखो ।

जैसा कि टिप्पणियों में कहा गया है, परमाणुता दृश्यता नहीं दर्शाती है। इसलिए जब एक और सूत्र को आंशिक रूप से लिखित intनहीं देखने की गारंटी दी जाती है , तो यह कभी भी नया मूल्य नहीं देख सकता है।

लंबे और दोहरे पर परिचालन सामान्य 64 बिट सीपीयू परमाणु के साथ-साथ होता है , हालांकि इसकी कोई गारंटी नहीं है। यह सुविधा अनुरोध भी देखें ।


21
करने के लिए कार्य volatile: देशांतर और युगल होने के लिए परमाणु की गारंटी है java.sun.com/docs/books/jls/third_edition/html/memory.html#17.7
Joonas Pulakka

12
यह भी ध्यान में रखें कि जब ऑपरेशन परमाणु होते हैं, तब तक उन कार्यों की दृश्यता की गारंटी एक बहुपरत एप्लिकेशन में नहीं दी जा सकती है जब तक कि विशेष देखभाल नहीं की जाती है (यहाँ विवरण एक टिप्पणी में वर्णन करने के लिए जटिल हैं ..)
nos

5
64 bit jvm, long and double assignments are also atomic.क्या आपको यकीन है? मैं कहूंगा कि वे संकलित कोड के लिए हैं, लेकिन कोड की व्याख्या के बारे में क्या? संभवतः आप सही हैं, लेकिन क्या इसकी कोई गारंटी है?
मातरिनस

4
युक्ति अभी भी नहीं बताती है कि 64-बिट JVM लंबे और दोहरे असाइनमेंट को परमाणुता प्रदान करते हैं। java.sun.com/docs/books/jls/third_edition/html/memory.html#17.7 अपने प्रसिद्ध शब्दों में, "यह व्यवहार विशिष्ट कार्यान्वयन है"। हालाँकि, अधिक संभावना नहीं है, 64-बिट VMs इसे परमाणु ऑपरेशन के रूप में लागू करेंगे।
15 जून को sjlee

1
IMHO, सामान्य संदर्भ असाइनमेंट परमाणु हैं, लेकिन AtomicReference अधिक प्रदान करता है: ComparAndSet और getAndSet, जो कि आप सिंक्रनाइज़ेशन के बिना अन्यथा प्राप्त नहीं कर सकते हैं।
Maaartinus

5

जावा में, 32-बिट या छोटी मात्रा में पढ़ना और लिखना परमाणु होने की गारंटी है।
परमाणु द्वारा, हमारा मतलब है कि प्रत्येक क्रिया एक चरण में होती है और इसे बाधित नहीं किया जा सकता है। इस प्रकार, जब हमारे पास बहुपरत अनुप्रयोग होते हैं, तो पढ़ने और लिखने के संचालन थ्रेड-सुरक्षित होते हैं और इसे सिंक्रनाइज़ नहीं किया जाना चाहिए।

उदाहरण के लिए, निम्न कोड थ्रेड सुरक्षित है:

public class ThreadSafe   
  {  
    private int x;  
    public void setX(int x)  
          {
           this.x = x;
           } 
  }

5
.. इस अर्थ में कि हमेशा मूल्य या तो मूल मूल्य या निर्धारित मूल्य होगा। "वाष्पशील" या "सिंक्रनाइज़" की कमी के कारण अधिकांश मूल्य आज भी आवश्यक रूप से अन्य थ्रेड्स को दिखाई नहीं देते हैं।
मिको विल्कमैन

1
+1 क्या @MikkoWilkman कहता है। कोड के उस टुकड़े का उपयोग नहीं किया जाना चाहिए क्योंकि यह निश्चित रूप से मेमोरी दृश्यता के दृष्टिकोण से सुरक्षित नहीं है।
Echidna

0

ऐसा लगता है कि एटॉमिकलॉन्ग.जावा में इस पद्धति के आधार पर लोंगो के कार्य परमाणु होते हैं:

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

किसी भी सिंक्रनाइज़ेशन की अनुपस्थिति पर ध्यान दें।


3
की घोषणा को देखो value। यह है volatile
माॅर्टिनस

2
यही कारण है कि valueहै volatileका काम नहीं है valueपरमाणु, यह महज से बचा जाता है "का प्रकाशन" मुद्दों।
लाइल जेड

7
यह दोनों करता है, जेएलएस देखें , खंड 17.7 : अस्थिर लंबे और दोहरे मूल्यों के लेखन और रीड हमेशा परमाणु होते हैं।
Maaartinus

मेरी राय में, इस सूत्र में सबसे मूल्यवान टिप्पणी @LyleZ
stdout
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.