क्या कोई मुझे बता सकता है कि दो अलग-अलग दृष्टिकोणों के लाभ और दोष क्या हैं?जावा लंबे प्रकार के अस्थिर क्षेत्रों का समर्थन करता है, जबकि सी # नहीं - इसके पीछे क्या कारण हैं?
उत्तर
जब एक double
या long
जावा में volatile
है, §17.7 of the Java Language Specification की आवश्यकता है कि वे पढ़ सकते हैं और atomically लिखा जाता है। जब वे अस्थिर नहीं होते हैं, तो उन्हें कई परिचालनों में लिखा जा सकता है। इसका परिणाम हो सकता है, उदाहरण के लिए, लंबे समय के ऊपरी 32 बिट्स में एक नया मान होता है, जबकि निचले 32 बिट्स में अभी भी पुराना मान होता है।
परमाणु पढ़ने और लिखने के लिए प्रोग्रामर के लिए सही कोड लिखने और लिखने के लिए आसान है। हालांकि, परमाणु संचालन के लिए समर्थन कुछ वातावरण में वीएम कार्यान्वयन पर बोझ लगा सकता है।
मुझे लगता है कि यह स्मृति मॉडल की गारंटी के अनुसार आता है। मुझे सीएलआई मेमोरी मॉडल (जिसे सी # का उपयोग करना है) के बारे में बहुत अधिक जानकारी नहीं है, लेकिन मुझे पता है कि यह 32 बिट्स की गारंटी देगा ... लेकिन 64 नहीं (हालांकि यह x64 पर 64-बिट संदर्भ की गारंटी देगा - ईसीएमए 334 वी 4 के पूर्ण नियम §17.4.3 में हैं)। तो यह volatile
नहीं हो सकता है। आपके पास अभी भी Interlocked
विधियां हैं, हालांकि (जैसे long Interlocked.Exchange(ref long,long)
और long Interlocked.Increment(ref long)
आदि)।
मुझे लगता है कि लंबे समय तक सी # में अस्थिर नहीं हो सकता है क्योंकि वे 32-बिट्स से बड़े हैं और परमाणु संचालन में नहीं पहुंचा जा सकता है। भले ही वे किसी रजिस्टर या सीपीयू कैश में संग्रहीत नहीं होंगे, क्योंकि मान को पढ़ने या लिखने के लिए एक से अधिक ऑपरेशन लेते हैं, एक थ्रेड के लिए मूल्य पढ़ने के लिए संभव है जबकि दूसरा इसे लिखने की प्रक्रिया में है।
मेरा मानना है कि जावा कैसे अस्थिर क्षेत्रों को लागू करता है और कैसे डॉटनेट करता है, लेकिन मुझे विवरण पर यकीन नहीं है। सी # की समस्या को रोकने के लिए जावा फ़ील्ड पर लॉक का उपयोग कर सकता है।
मुझे पता नहीं है कि सी # में 64-बिट इनट्स पर अस्थिरता क्यों लागू नहीं की जा सकती है, लेकिन आप सी # में जो चाहते हैं उसे करने के लिए आप Thread.VolatileWrite का उपयोग कर सकते हैं। अस्थिर कीवर्ड इस कॉल पर सिर्फ वाक्य रचनात्मक चीनी है।
अंश:
नोट: सी # में, एक क्षेत्र की गारंटी देता है पर अस्थिर संशोधक है कि उस क्षेत्र की असीमित एक्सेस Thread.VolatileRead या Thread.VolatileWrite का उपयोग करता है का उपयोग कर।
सिंटैक्टिक चीनी (कीवर्ड) 32-बिट इनट्स पर लागू होता है, लेकिन आप 64-बिट इनट्स पर वास्तविक विधि कॉल का उपयोग कर सकते हैं।
- 1. जबकि (! अस्थिर) क्या करता है; कर?
- 2. सी ++ 11 अज्ञात structs का समर्थन क्यों नहीं करता है, जबकि सी 11 करता है?
- 3. क्या कोई कारण है कि सी 99 फ़ंक्शन ओवरलोडिंग का समर्थन नहीं करता है?
- 4. एक स्व प्रकार में '=>' के पीछे क्या कारण है?
- 5. प्रबंधित प्लेटफॉर्म के लिए उपलब्ध क्या है इसके पीछे सी और सी ++ आईडीई उपकरण का समर्थन क्यों है?
- 6. जावा समर्थन और ऑटोबॉक्सिंग का समर्थन क्यों नहीं करता है?
- 7. क्या जीसीसी लंबे समय तक int का समर्थन करता है?
- 8. क्या सी ++ में लंबे लंबे int से अधिक प्रकार हैं?
- 9. क्या() Object.clone पीछे कारण
- 10. क्या LevelDB जावा का समर्थन करता है?
- 11. समस्याएं जबकि अस्थिर भंडार
- 12. क्या सी # जेनेरिक समर्थन प्रकार हस्ताक्षर बाधाओं का समर्थन करता है?
- 13. क्या OpenRasta मोनो का समर्थन करता है?
- 14. क्या Google क्रोम कस्टम एमआईएम प्रकार का समर्थन करता है?
- 15. SQL Azure SqlCacheDependency का समर्थन नहीं करता है? क्या
- 16. जावा जैसी भाषाएं पदानुक्रमित पैकेज नामों का उपयोग क्यों करती हैं, जबकि पायथन नहीं करता है?
- 17. क्या कोई तकनीकी/वैचारिक कारण है कि आईओएस कोको बाइंडिंग का समर्थन नहीं करता है?
- 18. सी में लंबे डेटा प्रकार का उपयोग कैसे करें?
- 19. विम यूनिकोड का समर्थन नहीं करता है?
- 20. जीसीसी समर्थन नग्न कार्यों का समर्थन क्यों नहीं करता है?
- 21. आर। जावा के पीछे अवधारणा क्या है?
- 22. क्या कोई कारण है MySQL पूर्ण बाहरी जॉइन का समर्थन नहीं करता है?
- 23. क्षेत्रों के साथ मेमोरी कैश का समर्थन?
- 24. जावा कन्स्ट्रक्टर के लिए टाइप अनुमान का समर्थन क्यों नहीं करता है?
- 25. जावा सूची इंटरफ़ेस getLast() का समर्थन क्यों नहीं करता है?
- 26. एंड्रॉइड समर्थन .jks keystore प्रकार करता है?
- 27. इंटरलाक्ड क्यों होता है। एक्सचेंज बूलियन प्रकार का समर्थन नहीं करता है?
- 28. जावा varargs समर्थन संग्रह क्यों नहीं करता है?
- 29. क्या जावा सहयोगी सरणी का समर्थन करता है?
- 30. 'exampleof function() {}' का उपयोग करने के पीछे कारण?
फिर भी, यह अजीब बात है कि कोड आपको एक अस्थिर 64-बिट फ़ील्ड निर्दिष्ट करने की अनुमति नहीं देगा जब आप x64 होने के लिए प्लेटफॉर्म निर्दिष्ट करते हैं। –
सीएलआई को अंतर्निहित प्लेटफॉर्म के मामले में काम करना चाहिए, इसलिए यह वादे नहीं करना चाहता है जो आप चल रहे हैं उस पर निर्भर करते हैं। –