आप सही हैं। अस्थिरता एक दृश्यता गारंटी प्रदान करता है। सिंक्रनाइज़ किया गया एक दृश्यता गारंटी और संरक्षित कोड खंडों का क्रमिकरण दोनों प्रदान करता है। के लिए बहुत साधारण स्थितियों अस्थिर पर्याप्त है, लेकिन यह तुल्यकालन के बजाय अस्थिर का उपयोग कर मुसीबत में करने के लिए आसान है।
आप खाते की राशि का समायोजन करने का एक तरीका है कि ग्रहण करने के लिए थे, तो अस्थिर नहीं काफी अच्छा
public void add(double amount)
{
balance = balance + amount;
}
फिर हम अगर संतुलन कोई अन्य तुल्यकालन के साथ अस्थिर है एक समस्या है है। दो धागे कोशिश करते हैं और (जोड़ने कॉल करने के लिए थे, तो) एक साथ आप एक "याद" अद्यतन जहां निम्नलिखित
Thread1 - Calls add(100)
Thread2 - Calls add(200)
Thread1 - Read balance (0)
Thread2 - Read balance (0)
Thread1 - Compute new balance (0+100=100)
Thread2 - Compute new balance (0+200=200)
Thread1 - Write balance = 100
Thread2 - Write balance = 200 (WRONG!)
होता है जाहिर है यह गलत है क्योंकि दोनों धागे वर्तमान मूल्य पढ़ सकते हैं और स्वतंत्र रूप से अद्यतन और फिर इसे वापस लिखा हो सकता था (पढ़ें, गणना करें, लिखें)। अस्थिरता यहां मदद नहीं करती है, इसलिए आपको यह सुनिश्चित करने के लिए सिंक्रनाइज़ करने की आवश्यकता होगी कि एक धागा अन्य धागे शुरू होने से पहले पूरे अपडेट को पूरा कर ले।
मैं सामान्य पाते हैं जब कुछ कोड लिखने मुझे लगता है कि "मैं बजाय सिंक्रनाइज़ के अस्थिर उपयोग कर सकते हैं" जवाब अच्छी तरह से "हाँ" लेकिन गलत यह सुनिश्चित करने के लिए यह पता लगाना के समय/प्रयास और होने का खतरा हो सकता है लाभ के लायक नहीं है (मामूली प्रदर्शन)।
एक के रूप में एक तरफ एक अच्छी तरह से लिखा खाता वर्ग आंतरिक रूप से सभी सिंक तर्क संभाल तो कॉल इसके बारे में चिंता करने की ज़रूरत नहीं होगी।
स्रोत
2010-06-23 16:11:12
आप सही हैं, लेकिन लेख कुछ पूरी तरह से अलग के बारे में वास्तव में है - ताला गुंजाइश को कम करने। – gustafc