在Collections中有方法使它们变成线程安全的。
public static <T> List<T> synchronizedList(List<T> list) public static <T> Set<T> synchronizedSet(Set<T> s) public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m)
其实实现线程安全还是比较简单的,还记得Hashtable中如何实现线程安全的吗?就是加一个syschronized同步方法。那么,现在转线程安全,上面的方法是如何做得到的呢?
static class SynchronizedList<E> extends SynchronizedCollection<E> implements List<E> { 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 equals(Object o) { synchronized(mutex) {return list.equals(o);} } public int hashCode() { synchronized(mutex) {return list.hashCode();} } public E get(int index) { synchronized(mutex) {return list.get(index);} } public E set(int index, E element) { synchronized(mutex) {return list.set(index, element);} } public void add(int index, E element) { synchronized(mutex) {list.add(index, element);} } }
看到没有,它用的是同步代码块。