2009-06-08 5 views

उत्तर

8

जब एक double या long जावा में volatile है, §17.7 of the Java Language Specification की आवश्यकता है कि वे पढ़ सकते हैं और atomically लिखा जाता है। जब वे अस्थिर नहीं होते हैं, तो उन्हें कई परिचालनों में लिखा जा सकता है। इसका परिणाम हो सकता है, उदाहरण के लिए, लंबे समय के ऊपरी 32 बिट्स में एक नया मान होता है, जबकि निचले 32 बिट्स में अभी भी पुराना मान होता है।

परमाणु पढ़ने और लिखने के लिए प्रोग्रामर के लिए सही कोड लिखने और लिखने के लिए आसान है। हालांकि, परमाणु संचालन के लिए समर्थन कुछ वातावरण में वीएम कार्यान्वयन पर बोझ लगा सकता है।

5

मुझे लगता है कि यह स्मृति मॉडल की गारंटी के अनुसार आता है। मुझे सीएलआई मेमोरी मॉडल (जिसे सी # का उपयोग करना है) के बारे में बहुत अधिक जानकारी नहीं है, लेकिन मुझे पता है कि यह 32 बिट्स की गारंटी देगा ... लेकिन 64 नहीं (हालांकि यह x64 पर 64-बिट संदर्भ की गारंटी देगा - ईसीएमए 334 वी 4 के पूर्ण नियम §17.4.3 में हैं)। तो यह volatile नहीं हो सकता है। आपके पास अभी भी Interlocked विधियां हैं, हालांकि (जैसे long Interlocked.Exchange(ref long,long) और long Interlocked.Increment(ref long) आदि)।

+0

फिर भी, यह अजीब बात है कि कोड आपको एक अस्थिर 64-बिट फ़ील्ड निर्दिष्ट करने की अनुमति नहीं देगा जब आप x64 होने के लिए प्लेटफॉर्म निर्दिष्ट करते हैं। –

+3

सीएलआई को अंतर्निहित प्लेटफॉर्म के मामले में काम करना चाहिए, इसलिए यह वादे नहीं करना चाहता है जो आप चल रहे हैं उस पर निर्भर करते हैं। –

0

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

मेरा मानना ​​है कि जावा कैसे अस्थिर क्षेत्रों को लागू करता है और कैसे डॉटनेट करता है, लेकिन मुझे विवरण पर यकीन नहीं है। सी # की समस्या को रोकने के लिए जावा फ़ील्ड पर लॉक का उपयोग कर सकता है।

7

मुझे पता नहीं है कि सी # में 64-बिट इनट्स पर अस्थिरता क्यों लागू नहीं की जा सकती है, लेकिन आप सी # में जो चाहते हैं उसे करने के लिए आप Thread.VolatileWrite का उपयोग कर सकते हैं। अस्थिर कीवर्ड इस कॉल पर सिर्फ वाक्य रचनात्मक चीनी है।

अंश:

नोट: सी # में, एक क्षेत्र की गारंटी देता है पर अस्थिर संशोधक है कि उस क्षेत्र की असीमित एक्सेस Thread.VolatileRead या Thread.VolatileWrite का उपयोग करता है का उपयोग कर।

सिंटैक्टिक चीनी (कीवर्ड) 32-बिट इनट्स पर लागू होता है, लेकिन आप 64-बिट इनट्स पर वास्तविक विधि कॉल का उपयोग कर सकते हैं।

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