जावा विनिर्देश की गारंटी देता है आदिम चर असाइनमेंट हमेशा परमाणु कर रहे हैं (long
और डबल types
के लिए उम्मीद है।रिलेशन
इसके विपरीत, Fetch-and-Add आपरेशन प्रसिद्ध i++
वेतन वृद्धि आपरेशन करने के लिए इसी, गैर परमाणु होगा । क्योंकि, रीड-संशोधित-लिखने आपरेशन के लिए अग्रणी
इस कोड को मान लिया जाये:
public void assign(int b) {
int a = b;
}
उत्पन्न बाईटकोड है:
public void assign(int);
Code:
0: iload_1
1: istore_2
2: return
इस प्रकार, हम देखते हैं काम दो कदम (लदान और भंडारण) से बना है। यह जानते हुए कि X86 प्रोसेसर कर सकते हैं (कम से कम आधुनिक लोगों पर), वेतन वृद्धि आपरेशन atomically संचालित
public void assign(int);
Code:
0: iload_1
1: iinc 1, 1 //extra step here regarding the previous sample
4: istore_2
5: return
, के रूप में कहा:
public void assign(int b) {
int i = b++;
}
Bytecode:
इस कोड को मान लिया जाये कि
कंप्यूटर विज्ञान में, fetch-and-add CPU निर्देश एक विशेष निर्देश है जो परमाणु रूप से संशोधित स्मृति स्थान की सामग्री। इसका उपयोग मल्टीप्रोसेसर सिस्टम में पारस्परिक बहिष्कार और समवर्ती एल्गोरिदम लागू करने के लिए किया जाता है, जो सैमफोरों का एक सामान्यीकरण है।
इस प्रकार, पहला सवाल: तथ्य यह है कि बाईटकोड दोनों चरणों (लोड हो रहा है और भंडारण) की आवश्यकता है के बावजूद, जावा तथ्य यह है कि काम आपरेशन एक ऑपरेशन हमेशा atomically जो कुछ भी प्रोसेसर की वास्तुकला और इतने किया जाता है पर निर्भर करता है अपने विनिर्देश में स्थायी परमाणु (आदिम असाइनमेंट के लिए) सुनिश्चित कर सकते हैं?
दूसरा सवाल: यह पुष्टि करते हैं कि बहुत ही आधुनिक X86 प्रोसेसर के साथ और विभिन्न आर्किटेक्चर भर में संकलित कोड साझा किए बिना गलत है, कोई जरूरत नहीं सब पर i++
आपरेशन (या AtomicInteger
) सिंक्रनाइज़ करने के लिए क्या है? इसे पहले से ही परमाणु मानते हैं।
मेरी समझ यह है कि असाइनमेंट की परमाणु केवल इसका अर्थ है कि आइसोर परमाणु है - दूसरे शब्दों में 'ए = बी' में, यह संभव है कि 'बी' पढ़ा जाए, फिर एक नए मान में परिवर्तित हो जाए तो मूल मान 'ए' को सौंपा गया। हालांकि, परमाणुता गारंटी देता है कि 'ए' 'बी' के 2 मूल्यों का मिश्रण नहीं होगा। – assylias
@assylias मैंने यही सोचा, मैं इस परिप्रेक्ष्य से सहमत हूं :) – Mik378