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作为同步锁了