2009-10-15 8 views
23

मेरा प्रश्न यह संदर्भित करता है कि एक पुनर्वित्त लॉक का उपयोग किसी क्षेत्र के दृश्यता की गारंटी देता है जो सिंक्रनाइज़ किए गए कीवर्ड प्रदान करता है।क्या पुनर्विक्रेता लॉक के माध्यम से उपयोग किए जाने वाले फ़ील्ड के लिए अस्थिर कीवर्ड आवश्यक है?

उदाहरण के लिए, निम्नलिखित वर्ग एक, क्षेत्र sharedData अस्थिर घोषित करने के रूप में सिंक्रनाइज़ कीवर्ड प्रयोग किया जाता है की जरूरत नहीं है में।

class A 
{ 
    private double sharedData; 

    public synchronized void method() 
    { 
    double temp = sharedData; 
    temp *= 2.5; 
    sharedData = temp + 1; 
    } 
} 

हालांकि पुनर्वित्त लॉक का उपयोग करते हुए अगले उदाहरण के लिए, आवश्यक फ़ील्ड पर अस्थिर कीवर्ड है?

class B 
{ 
    private final ReentrantLock lock = new ReentrantLock(); 
    private volatile double sharedData; 

    public void method() 
    { 
    lock.lock(); 
    try 
    { 
     double temp = sharedData; 
     temp *= 2.5; 
     sharedData = temp + 1; 
    } 
    finally 
    { 
     lock.unlock(); 
    } 
    } 
} 

मुझे पता है कि वैसे भी अस्थिर कीवर्ड का उपयोग केवल संभावना एक miniscule प्रदर्शन हिट लागू होगा, लेकिन मैं अभी भी सही ढंग से कोड करने के लिए करना चाहते हैं।

उत्तर

28

यह अस्थिरता के बिना सुरक्षित है। ReentrantLockLock लागू करता है, और docs for Lock में शामिल हैं:

सभी Lock कार्यान्वयन अर्थ विज्ञान के रूप में द्वारा प्रदान लागू करना होगा एक ही स्मृति तुल्यकालन में निर्मित मॉनिटर ताला, जावा भाषा विशिष्टता, तीसरा संस्करण में वर्णित के रूप (17.4 मेमोरी मॉडल):

  • एक सफल lock आपरेशन के रूप में उसी स्मृति तुल्यकालन असर पड़ता है एक सफल Lock कार्रवाई।
  • एक सफल unlock आपरेशन एक सफल Unlock कार्रवाई के रूप में ही स्मृति तुल्यकालन असर पड़ता है।
+0

क्या यह सलाह फ़ील्ड hoisting के कारण 'जबकि (फ़ील्ड)' के संबंध में सच है? – Pod

+0

@Pod: 'while' लूप लॉक के साथ कैसे इंटरैक्ट करता है, इसके बारे में अधिक विशिष्ट विवरण के बिना, यह कहना असंभव है। आप शायद एक विशिष्ट उदाहरण के साथ एक नया सवाल बनाना चाहते हैं। –

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

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