2016-01-04 4 views
5

मैं स्रोत कोड में थोड़ा खुदाई करने का फैसला किया और पाया है कि Collections.synchronizedList(List) इस प्रकार लागू किया गया है:क्या यह सिंक्रनाइज़ रैपर पर फिर से सुरक्षित है?

public static <T> List<T> synchronizedList(List<T> list) { 
    return (list instanceof RandomAccess ? 
     new SynchronizedRandomAccessList<T>(list) : 
     new SynchronizedList<T>(list)); 
} 

जहां SynchronizedList नेस्टेड वर्ग है:

static class SynchronizedList<E> 
extends SynchronizedCollection<E> 
      implements List<E> { 
    private static final long serialVersionUID = -7754090372962971524L; 
    final List<E> list; 

    SynchronizedList(List<E> list) { 
     super(list); 
     this.list = list; 
    } 
    SynchronizedList(List<E> list, Object mutex) { 
     super(list, mutex); 
     this.list = list; 
    } 

    public boolean More ...equals(Object o) { 
     synchronized(mutex) {return list.equals(o);} 
    } 

    //ommited 

    public void add(int index, E element) { 
     synchronized(mutex) {list.add(index, element);} 
    } 

    public E remove(int index) { 
     synchronized(mutex) {return list.remove(index);} 
    } 

    //rest is ommited 
} 

के रूप में देखा मधुमक्खी कर सकते हैं, वर्ग एक useses थ्रेड-सुरक्षा प्रदान करने के लिए private लॉक ऑब्जेक्ट। लेकिन the documentation हमें फ़ैक्टरी विधि द्वारा लौटाए गए objetct पर लॉकिंग का उपयोग करके इसे फिर से चालू करने की अनुमति देता है।

यह आवश्यक है कि उपयोगकर्ता मैन्युअल रूप से जब यह खत्म हो पुनरावृत्ति लौटे सूची पर सिंक्रनाइज़:

तो, हम विभिन्न ताले पुनरावृत्ति और सूची को संशोधित करने के लिए (add, remove, आदि) का उपयोग करें।

इसे सुरक्षित क्यों माना जाता है?

+0

_So, हम list_ को पुन: संशोधित करने और संशोधित करने के लिए विभिन्न ताले का उपयोग करते हैं, आपको ऐसा क्या लगता है? –

+0

@SotiriosDelimanolis स्रोत कोड मैंने उद्धृत किया। नेस्टेड क्लास में हम सिंक्रनाइज़ (म्यूटेक्स) का उपयोग करते हैं जो बाहर से एक्सेसिबल नहीं है। –

उत्तर

7

Collections#synchronizedList विधि

public static <T> List<T> synchronizedList(List<T> list) { 
    return (list instanceof RandomAccess ? 
      new SynchronizedRandomAccessList<>(list) : 
      new SynchronizedList<>(list)); 
} 

का उपयोग करता है एक पैरामीटर निर्माता है कि आप अपने प्रश्न में दिखाया गया है। वह कन्स्ट्रक्टर सुपर कन्स्ट्रक्टर को आमंत्रित करता है जो this को mutex के रूप में सेट करता है। सभी विधियां synchronizedmutex, this पर हैं।

प्रलेखन आपको इत्यादि के दौरान उदाहरण पर सिंक्रनाइज़ करने के लिए कह रहा है। यह संदर्भ विधि निकायों के भीतर this जैसा ही है।

ये सभी कार्य हैं (यदि आप इसे सही करते हैं) तो एक ही लॉक साझा करना चाहिए।

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