2010-04-12 18 views
7

मैं एक वर्ग है कि यह एक तरह एक बूलियन क्षेत्र शामिल है। मेरा सवाल यह है कि अगर मुझे लॉक स्टेटमेंट के साथ गेटर और सेटर बाड़ लगाना चाहिए? या क्या मुझे बस अस्थिर कीवर्ड का उपयोग करना चाहिए और लॉकिंग को सहेजना चाहिए? या बूलियन मूल्यों को परमाणु स्थापित करने और सेट करने के बाद से मैं पूरी तरह से मल्टीथ्रेडिंग को अनदेखा कर सकता हूं?बहु सूत्रण और बूलियन

संबंध है,

उत्तर

9

पढ़ सकते हैं यहां कई समस्याएं हैं।

सरल पहले। हां, एक बुलियन वैरिएबल को पढ़ना और लिखना एक परमाणु ऑपरेशन है।

: (स्पष्टीकरण कि पढ़ सकते हैं और संचालन बारे में खुद से बूलियन्स के लिए परमाणु संचालन, दो आपरेशन, जो एक साथ परमाणु नहीं होगा रहे हैं और लेखन, ज़ाहिर है कि वसीयत पढ़ नहीं उत्पन्न क्या मेरा मतलब है) हालांकि, जब तक आप अतिरिक्त कदम नहीं उठाते, संकलक इस तरह के पढ़ने और लिखने को अनुकूलित कर सकता है, या आसपास के परिचालनों को स्थानांतरित कर सकता है, जो आपके कोड को आपके इरादे से अलग तरीके से संचालित कर सकता है।

फ़ील्ड को volatile के रूप में चिह्नित करने का अर्थ है कि संचालन को अनुकूलित नहीं किया जाएगा, निर्देश मूल रूप से कहता है कि संकलक को कभी भी यह मानना ​​चाहिए कि इस क्षेत्र में मान पिछले जैसा जैसा नहीं है, भले ही इसे इसे पढ़ा जाए पिछला निर्देश

हालांकि, मल्टीकोर और मल्टीक्यू मशीनों पर, विभिन्न कोर और सीपीयू के पास उनके कैश में फ़ील्ड के लिए एक अलग मूल्य हो सकता है, और इस प्रकार आप lock { } क्लॉज, या किसी अन्य चीज को याद करते हैं जो स्मृति बाधा को मजबूर करता है। यह सुनिश्चित करेगा कि क्षेत्र मूल्य कोर भर में सुसंगत है। इसके अतिरिक्त, पढ़ता है और लिखता है कोड में मेमोरी बाधा से आगे नहीं बढ़ेगा, जिसका मतलब है कि संचालन कहां होता है।

तो यदि आपको संदेह है, या पता है कि यह फ़ील्ड कई धागे से लिखा और पढ़ा जाएगा, तो मैं निश्चित रूप से मिश्रण में लॉकिंग और अस्थिर जोड़ दूंगा।

ध्यान दें कि मैं multithreading में कोई विशेषज्ञ नहीं हूं, मैं अपना खुद का पकड़ने में सक्षम हूं, लेकिन मैं आमतौर पर रक्षात्मक रूप से प्रोग्राम करता हूं। हो सकता है (मुझे लगता है कि यह अत्यधिक संभावना है) कि आप किसी ऐसे लॉक को लागू कर सकते हैं जो लॉक का उपयोग नहीं करता है (कई लॉक-फ्री संरचनाएं हैं), लेकिन दुख की बात है कि मैं उन चीजों को संभालने के लिए इस विषय में पर्याप्त अनुभव नहीं कर रहा हूं। इस प्रकार मेरी सलाह है कि lock खंड और volatile निर्देश दोनों को जोड़ना है।

+0

"एक बूलियन चर पढ़ने और लिखना एक परमाणु ऑपरेशन है।" ... यह सच नहीं है। "बूलियन ए = बी" के रूप में कुछ सरल 2 जेवीएम निर्देश उत्पन्न करता है। – sgp15

+0

मुझे खेद है, * पढ़ना * और * लेखन * ऑपरेशन स्वयं द्वारा बूलियन, पढ़ने और फिर लिखने के लिए परमाणु संचालन हैं, दो है। यह ** .NET ** के साथ ही जावा के लिए भी सच है। –

2

अकेले अस्थिर पर्याप्त नहीं है और एक अलग उद्देश्य, ताला ठीक किया जाना चाहिए के लिए कार्य करता है, लेकिन अंत में यह निर्भर करता है कि किसी को भी MyClass iself, कौन जानता है में boolVal सेट करने के लिए जा रहा है, तो आप हो सकता है वहाँ एक कसरत धागा कताई। यह भी निर्भर करता है और आप आंतरिक रूप से boolVal का उपयोग कैसे कर रहे हैं। आपको कहीं और सुरक्षा की आवश्यकता हो सकती है। यदि आप मुझसे पूछते हैं, यदि आप मर चुके हैं तो सुनिश्चित करें कि आप एक से अधिक धागे में MyClass का उपयोग करने जा रहे हैं, तो इसके बारे में सोचने के लायक भी नहीं है।

पीएस आप this section

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