मैं स्रोत कोड में थोड़ा खुदाई करने का फैसला किया और पाया है कि 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
, आदि) का उपयोग करें।
इसे सुरक्षित क्यों माना जाता है?
_So, हम list_ को पुन: संशोधित करने और संशोधित करने के लिए विभिन्न ताले का उपयोग करते हैं, आपको ऐसा क्या लगता है? –
@SotiriosDelimanolis स्रोत कोड मैंने उद्धृत किया। नेस्टेड क्लास में हम सिंक्रनाइज़ (म्यूटेक्स) का उपयोग करते हैं जो बाहर से एक्सेसिबल नहीं है। –