2012-01-02 11 views
14

मल्टीथ्रेडिंग में अस्थिर कीवर्ड बनाम सिंक्रनाइज़ेशन का उपयोग कब करें?जावा में मल्टीथ्रेडिंग में अस्थिर बनाम सिंक्रनाइज़ेशन का उपयोग कब करें?

+0

http://stackoverflow.com/questions/3214938/java-volatile-modifier-and-synchronized-blocks और एक त्वरित गोगलिंग बहुत सारी जानकारी दिखाएगा –

+0

डुप्लिकेट? https://stackoverflow.com/questions/9851133/ –

उत्तर

25

volatile का उपयोग करने के लिए यह सुनिश्चित करने के लिए कि एक चर के लिए प्रत्येक पढ़ने की पहुंच उस चर को लिखे गए नवीनतम मूल्य को देखेंगे। जब भी आपको कई निर्देशों के लिए स्थिर होने के लिए मूल्यों की आवश्यकता होती है तो synchronized का उपयोग करें। (ध्यान दें कि यह जरूरी कई बयानों मतलब यह नहीं है; एकल कथन:।

var++; // NOT thread safe! 

है नहीं धागा सुरक्षित भी var अगर volatile घोषित किया जाता है आप ऐसा करने की जरूरत:

synchronized(LOCK_OBJECT){var++;} 

देखें इस मुद्दे का एक अच्छा सारांश के लिए here

+0

'परमाणु लोंग' विधि के साथ 'var ++' को संभालता है और केवल 'अस्थिर' फ़ील्ड। क्या आप एक बेहतर उदाहरण प्रदान करने के लिए अपना जवाब संपादित कर सकते हैं? – Gray

+0

@ ग्रे - ठीक है। मेरा "बेहतर उदाहरण" यह है कि 'var' प्रकार' float' है। –

3

यह एक बहुत व्यापक सवाल है। सबसे अच्छा जवाब मैं दे सकता हूं synchronized का उपयोग करना जब कई कार्यों को परमाणु रूप से — होने पर देखा जाना चाहिए या तो कोई भी कदम नहीं हुआ है।

एक ही कार्रवाई के लिए, volatile पर्याप्त हो सकता है; यह अन्य धागे में परिवर्तन की दृश्यता सुनिश्चित करने के लिए स्मृति बाधा के रूप में कार्य करता है।

9

वाष्पशील केवल सुनिश्चित करता है। पढ़ा आपरेशन हमेशा धागे भर में स्मृति से नवीनतम राज्य देता है हालांकि, यह करता है संचालन के किसी भी लेखन सुरक्षा/आदेश को सुनिश्चित न करें, यानी दो थ्रेड किसी भी यादृच्छिक क्रम में अस्थिर चर अद्यतन कर सकते हैं। इसके अलावा यह यह सुनिश्चित करता है कि चर पर एकाधिक संचालन परमाणु हैं।

हालांकि एक सिंक्रनाइज़ ब्लॉक नवीनतम राज्य सुनिश्चित करता है और सुरक्षा लिखता है। इसके अलावा चर के लिए पहुंच और अद्यतन एक सिंक्रनाइज़ ब्लॉक के अंदर परमाणु है। ऊपर, फिर भी सच है, केवल तभी सभी पहुँच/प्रश्न में चर के लिए अद्यतन एक ही ताला वस्तु का उपयोग कर रहे हैं, जिससे कि कुछ ही समय में एक से अधिक थ्रेड चर के लिए उपयोग हो जाता है।

0

वोल्टाइल लॉक प्राप्त नहीं करता है, यह अंतर्निहित CPU आर्किटेक्चर का उपयोग करता है ताकि लेखन के बाद सभी धागे में दृश्यता सुनिश्चित हो सके।

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