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
等)。
爲什麼它被認爲是安全的?
_So,我們使用不同的鎖進行迭代和修改list_什麼讓你這麼想? –
@SotiriosDelimanolis我引用的源代碼。在嵌套類中,我們使用同步(互斥),這是外部不可訪問的。 –