मुझे पता है कि वृद्धि ऑपरेशन लॉकिंग के बिना सी ++ में परमाणु नहीं है।जावा में आईआईसी परमाणु है?
विल JVM iinc
शिक्षा का इसके कार्यान्वयन पर कोई ताला जोड़ सकता हूँ?
मुझे पता है कि वृद्धि ऑपरेशन लॉकिंग के बिना सी ++ में परमाणु नहीं है।जावा में आईआईसी परमाणु है?
विल JVM iinc
शिक्षा का इसके कार्यान्वयन पर कोई ताला जोड़ सकता हूँ?
कोई अपनी नहीं
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?
कोई यह परमाणु नहीं है, बाईटकोड अन्य धागे के साथ interleaved मिल सकती है।
नहीं ऐसा नहीं है और यह वास्तविक समस्याएं पैदा कर सकता। इस परीक्षा 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
समस्या हल नहीं होती कारण नहीं करता है।
+1 अस्थिर सहित:) –
असल में, यह कोड 'एनआई' फ़ील्ड को बढ़ाने के लिए 'आईआईएनसी' निर्देश का भी उपयोग नहीं करता है। 'आईआईएनसी' का उपयोग केवल स्थानीय चर के लिए किया जाता है, और इस मामले में केवल 'i ++' के लिए। – Clashsoft
i ++ जावा में परमाणु नहीं है।
यह उपयोग करने के लिए बेहतर है
AtomicInteger atomic= new AtomicInteger(1);
वहाँ की तरह
atomic.getAndDecrement();
atomic.getAndIncrement();
atomic.decrementAndGet();
atomic.incrementAndGet();
उपरोक्त विधि के साथ किसी भी आपरेशन में परिभाषित किया गया परमाणु होगा तरीके हैं।
इस वर्ग java.util.concurrent.atomic
पैकेज के अंतर्गत आता है। जावा 1.5
ने पहले से ही सुरक्षा और थ्रेड समरूपता के लिए कई सुविधाएं जोड़ दी हैं।
यह परमाणु नहीं है। यहाँ एक स्थिर पूर्णांक के बाद वेतन वृद्धि के लिए उत्पन्न बाइट कोड है:
0 getstatic 18; // Load value of variable.
3 iconst_1;
4 iadd;
5 putstatic 18; // Store value.
{हालांकि वहां पहले से ही एक स्वीकृत जवाब है, मैं, इस प्रकार देर और तकनीकी रूप से अनावश्यक जवाब कुछ स्पष्ट करने के लिए चाहता था}
अपने प्रश्न का उत्तर है कि क्या आप IINC
अनुदेश या, क्या अन्य उत्तर देने के लिए, ++
ऑपरेटर बात कर रहे हैं मतलब पर निर्भर करता है।
एक स्थिर या उदाहरण के मैदान पर ++
का उपयोग करना,, मिल वेतन वृद्धि, और सेट से ज्यादा कुछ नहीं है इस प्रकार यह है नहीं परमाणु (अन्य उत्तर इस में विस्तार से समझाया)।
लेकिन
जब से तुम अगर IINC
अनुदेश परमाणु है पूछा, यह असली जवाब नहीं है। वास्तव में, इस प्रश्न के उत्तर में से कोई भी जवाब निर्देश को संबोधित करता है, वे सभी ऑपरेटर के आस-पास या स्थिर फ़ील्ड पर उपयोग किए जाने वाले ऑपरेटर के आस-पास स्थित प्रतीत होते हैं।
IINC
अनुदेश केवल स्थानीय चर पर चल रही है। जैसा कि नाम से पता चलता है, वे केवल स्थानीय हैं, और केवल एक सीमित सीमित क्षेत्र से ही पहुंच योग्य हैं। इस प्रकार, किसी अन्य थ्रेड से स्थानीय चर का उपयोग करना संभव नहीं है। इसका मतलब यह है कि इससे कोई फर्क नहीं पड़ता कि निर्देश परमाणु है या नहीं।
आपके उत्तर के लिए धन्यवाद! – withparadox2
अच्छी तरह से स्पष्ट! मेरे उत्तर से आपके उत्तर में लिंक जोड़ा गया। –
आपको जावा के समवर्ती दस्तावेज़ को पढ़ना चाहिए जो जावा कंसुरेंसी की बुनियादी अवधारणाओं को समझने के लिए काफी अच्छा है। –
धन्यवाद, इसे अभी पढ़ना। 1 मिनट में स्वीकार करें। – StarPinkER
मदद करने में बहुत खुशी है! अच्छे संदर्भों के लिए –