Collections中有SynchronizedList方法
-
@ThreadSafe
-
class GoodListHelper <E> {
-
public List<E> list = Collections.synchronizedList(new ArrayList<E>());
-
-
public boolean putIfAbsent(E x) {
-
synchronized (list) {
-
boolean absent = !list.contains(x);
-
if (absent)
-
list.add(x);
-
return absent;
-
}
-
}
-
}
上面是一個對已有的同步的list增加一個線程安全的方法。
但是爲什麼鎖要加list呢?看看源碼:
public static <T> List<T> synchronizedList(List<T> list) {
return (list instanceof RandomAccess ?
new SynchronizedRandomAccessList<T>(list) :
new SynchronizedList<T>(list));
}
由源碼可知,list是RandomAccess的子類,所以,產生SynchronizedRandomAccessList:
SynchronizedRandomAccessList繼承自SynchronizedList,SynchronizedList繼承自SynchronizedCollection,SynchronizedRandomAccessList裏方法的同步都是用的mutex,mutex是一個object,在SynchronizedCollection中定義的,在構造函數中使其爲本身。
所以上面的代碼需要使用list作爲同步鎖了