पढ़ सकते हैं यहां कई समस्याएं हैं।
सरल पहले। हां, एक बुलियन वैरिएबल को पढ़ना और लिखना एक परमाणु ऑपरेशन है।
: (स्पष्टीकरण कि पढ़ सकते हैं और संचालन बारे में खुद से बूलियन्स के लिए परमाणु संचालन, दो आपरेशन, जो एक साथ परमाणु नहीं होगा रहे हैं और लेखन, ज़ाहिर है कि वसीयत पढ़ नहीं उत्पन्न क्या मेरा मतलब है) हालांकि, जब तक आप अतिरिक्त कदम नहीं उठाते, संकलक इस तरह के पढ़ने और लिखने को अनुकूलित कर सकता है, या आसपास के परिचालनों को स्थानांतरित कर सकता है, जो आपके कोड को आपके इरादे से अलग तरीके से संचालित कर सकता है।
फ़ील्ड को volatile
के रूप में चिह्नित करने का अर्थ है कि संचालन को अनुकूलित नहीं किया जाएगा, निर्देश मूल रूप से कहता है कि संकलक को कभी भी यह मानना चाहिए कि इस क्षेत्र में मान पिछले जैसा जैसा नहीं है, भले ही इसे इसे पढ़ा जाए पिछला निर्देश
हालांकि, मल्टीकोर और मल्टीक्यू मशीनों पर, विभिन्न कोर और सीपीयू के पास उनके कैश में फ़ील्ड के लिए एक अलग मूल्य हो सकता है, और इस प्रकार आप lock { }
क्लॉज, या किसी अन्य चीज को याद करते हैं जो स्मृति बाधा को मजबूर करता है। यह सुनिश्चित करेगा कि क्षेत्र मूल्य कोर भर में सुसंगत है। इसके अतिरिक्त, पढ़ता है और लिखता है कोड में मेमोरी बाधा से आगे नहीं बढ़ेगा, जिसका मतलब है कि संचालन कहां होता है।
तो यदि आपको संदेह है, या पता है कि यह फ़ील्ड कई धागे से लिखा और पढ़ा जाएगा, तो मैं निश्चित रूप से मिश्रण में लॉकिंग और अस्थिर जोड़ दूंगा।
ध्यान दें कि मैं multithreading में कोई विशेषज्ञ नहीं हूं, मैं अपना खुद का पकड़ने में सक्षम हूं, लेकिन मैं आमतौर पर रक्षात्मक रूप से प्रोग्राम करता हूं। हो सकता है (मुझे लगता है कि यह अत्यधिक संभावना है) कि आप किसी ऐसे लॉक को लागू कर सकते हैं जो लॉक का उपयोग नहीं करता है (कई लॉक-फ्री संरचनाएं हैं), लेकिन दुख की बात है कि मैं उन चीजों को संभालने के लिए इस विषय में पर्याप्त अनुभव नहीं कर रहा हूं। इस प्रकार मेरी सलाह है कि lock
खंड और volatile
निर्देश दोनों को जोड़ना है।
स्रोत
2010-04-12 08:55:16
"एक बूलियन चर पढ़ने और लिखना एक परमाणु ऑपरेशन है।" ... यह सच नहीं है। "बूलियन ए = बी" के रूप में कुछ सरल 2 जेवीएम निर्देश उत्पन्न करता है। – sgp15
मुझे खेद है, * पढ़ना * और * लेखन * ऑपरेशन स्वयं द्वारा बूलियन, पढ़ने और फिर लिखने के लिए परमाणु संचालन हैं, दो है। यह ** .NET ** के साथ ही जावा के लिए भी सच है। –