2011-04-19 6 views
18

में डबल चेक लॉकिंग कई लोगों के मुताबिक, कुछ हद तक सामान्य डबल-चेक किए गए लॉकिंग मुहावरे जावा के लिए टूटा हुआ है जब तक कि आप 1.5 या बाद में नहीं चल रहे हों और volatile कीवर्ड का उपयोग करें।एंड्रॉइड

एक टूट की दोबारा जांच कर ताला नमूना: उपरोक्त http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html

प्यूघ के विश्लेषण जावा VMs के लिए है:

// Broken multithreaded version 
// "Double-Checked Locking" idiom 
class Foo { 
    private Helper helper = null; 
    public Helper getHelper() { 
    if (helper == null) 
     synchronized(this) { 
     if (helper == null) 
      helper = new Helper(); 
     }  
    return helper; 
    } 
    // other functions and members... 
    } 

नमूना इस लेख है, जो भी इसे ठीक करने का विवरण प्रदान करता से आता है। मैं एंड्रॉइड पर काम करता हूं और अक्सर पुस्तकालयों का उपयोग करता हूं जो डबल-चेक किए गए लॉकिंग को नियोजित करते हैं। क्या दल्विक वीएम का मेमोरी मॉडल इस मुहावरे का समर्थन करता है?

+0

आप शायद अनुमान लगा सकते हैं कि मैं किस पर देख रहा था;) – Snicolas

उत्तर

10

इस question का उत्तर यह दर्शाता है कि स्मृति मॉडल समान होना चाहिए, और नया डबल चेक लॉकिंग मुहावरे काम करेगा। http://www.javamex.com/tutorials/double_checked_locking_fixing.shtml

यह स्पष्ट रूप से कहा गया है DCL ठीक करने के लिए 3 तरीके:

+1

Yup। "अस्थिर" कीवर्ड के अतिरिक्त, यह यूनिप्रोसेसर (एंड्रॉइड के सभी संस्करण) और एसएमपी (3.0 "हनीकोम्ब" और बाद में) पर काम करेगा। – fadden

+0

अन्यथा, हनीकोम्ब से पहले, गैर अस्थिर क्षेत्रों के साथ डबल लॉक जांच संभव है? @ फडेन बीटीडब्ल्यू, क्या कोई प्रतिबिंब कॉल दल्विक java.lang.Class कक्षा में कैशिंग है? कैशिंग द्वारा मेरा मतलब है कि जावा वीएम पर कुछ बाइटकोड पीढ़ी है: stackoverflow.com/a/414823/693752 – Snicolas

+1

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

0

मुझे लगता है कि प्रश्न के बारे में एक बहुत अच्छा लेख मिला। और यह आपके प्रश्न में दिखता है, हेल्पर क्षेत्र को अस्थिर घोषित किया जाना चाहिए, अन्यथा यह काम नहीं करता है।

जब उपयोग की बात आती है, यानी आपके मामले में रोबोगुसी, मुझे लगता है कि मैं लेख में उल्लिखित वर्ग लोडर विधि का पक्ष लेगा। यह मेरे लिए और कुशल के रूप में अधिक स्पष्ट है।