2013-03-08 8 views

उत्तर

17

कोई अपनी नहीं

  • ग के वर्तमान मूल्य प्राप्त करें।
  • पुनर्प्राप्त मूल्य में वृद्धि 1.
  • बढ़ी हुई मान को सी में वापस स्टोर करें।

Java Documentation for Atomicity and Thread Interference

आप या तो synchronized कीवर्ड का उपयोग करें या थ्रेड सुरक्षा के लिए AtomicXXX विधियों का उपयोग करने की जरूरत है।

अद्यतन:

public synchronized void increment() { 
    c++; 
} 

या

AtomicInteger integer = new AtomicInteger(1); 
//somewhere else in code 
integer.incrementAndGet(); 

भी पढ़ें: Is iinc atomic in Java?

+0

आपको जावा के समवर्ती दस्तावेज़ को पढ़ना चाहिए जो जावा कंसुरेंसी की बुनियादी अवधारणाओं को समझने के लिए काफी अच्छा है। –

+0

धन्यवाद, इसे अभी पढ़ना। 1 मिनट में स्वीकार करें। – StarPinkER

+0

मदद करने में बहुत खुशी है! अच्छे संदर्भों के लिए –

3

कोई यह परमाणु नहीं है, बाईटकोड अन्य धागे के साथ interleaved मिल सकती है।

6

नहीं ऐसा नहीं है और यह वास्तविक समस्याएं पैदा कर सकता। इस परीक्षा 200000000 मुद्रित करने के लिए माना जाता है, लेकिन यह हस्तक्षेप सूत्र में बाँधना

static int n; 

public static void main(String[] args) throws InterruptedException { 
    Runnable r = new Runnable() { 
     public void run() { 
      for(int i = 0; i < 100000000; i++) { 
       n++; 
      } 
     } 
    }; 
    Thread t1 = new Thread(r); 
    Thread t2 = new Thread(r); 
    t1.start(); 
    t2.start(); 
    t1.join(); 
    t2.join(); 
    System.out.println(n); 
} 

ध्यान दें कि volatile समस्या हल नहीं होती कारण नहीं करता है।

+0

+1 अस्थिर सहित:) –

+1

असल में, यह कोड 'एनआई' फ़ील्ड को बढ़ाने के लिए 'आईआईएनसी' निर्देश का भी उपयोग नहीं करता है। 'आईआईएनसी' का उपयोग केवल स्थानीय चर के लिए किया जाता है, और इस मामले में केवल 'i ++' के लिए। – Clashsoft

1

i ++ जावा में परमाणु नहीं है।
यह उपयोग करने के लिए बेहतर है

AtomicInteger atomic= new AtomicInteger(1); 

वहाँ की तरह

atomic.getAndDecrement(); 
atomic.getAndIncrement(); 
atomic.decrementAndGet(); 
atomic.incrementAndGet(); 

उपरोक्त विधि के साथ किसी भी आपरेशन में परिभाषित किया गया परमाणु होगा तरीके हैं।

इस वर्ग java.util.concurrent.atomic पैकेज के अंतर्गत आता है। जावा 1.5 ने पहले से ही सुरक्षा और थ्रेड समरूपता के लिए कई सुविधाएं जोड़ दी हैं।

0

यह परमाणु नहीं है। यहाँ एक स्थिर पूर्णांक के बाद वेतन वृद्धि के लिए उत्पन्न बाइट कोड है:

0 getstatic 18; // Load value of variable. 
3 iconst_1; 
4 iadd; 
5 putstatic 18; // Store value. 
6

{हालांकि वहां पहले से ही एक स्वीकृत जवाब है, मैं, इस प्रकार देर और तकनीकी रूप से अनावश्यक जवाब कुछ स्पष्ट करने के लिए चाहता था}

अपने प्रश्न का उत्तर है कि क्या आप IINC अनुदेश या, क्या अन्य उत्तर देने के लिए, ++ ऑपरेटर बात कर रहे हैं मतलब पर निर्भर करता है।

एक स्थिर या उदाहरण के मैदान पर ++ का उपयोग करना,, मिल वेतन वृद्धि, और सेट से ज्यादा कुछ नहीं है इस प्रकार यह है नहीं परमाणु (अन्य उत्तर इस में विस्तार से समझाया)।

लेकिन

जब से तुम अगर IINCअनुदेश परमाणु है पूछा, यह असली जवाब नहीं है। वास्तव में, इस प्रश्न के उत्तर में से कोई भी जवाब निर्देश को संबोधित करता है, वे सभी ऑपरेटर के आस-पास या स्थिर फ़ील्ड पर उपयोग किए जाने वाले ऑपरेटर के आस-पास स्थित प्रतीत होते हैं।


IINC अनुदेश केवल स्थानीय चर पर चल रही है। जैसा कि नाम से पता चलता है, वे केवल स्थानीय हैं, और केवल एक सीमित सीमित क्षेत्र से ही पहुंच योग्य हैं। इस प्रकार, किसी अन्य थ्रेड से स्थानीय चर का उपयोग करना संभव नहीं है। इसका मतलब यह है कि इससे कोई फर्क नहीं पड़ता कि निर्देश परमाणु है या नहीं।

+0

आपके उत्तर के लिए धन्यवाद! – withparadox2

+0

अच्छी तरह से स्पष्ट! मेरे उत्तर से आपके उत्तर में लिंक जोड़ा गया। –

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