最低要求的同步化工具
原理
把非线程安全的集合类包装成线程安全的,采取装饰器模式,为所有操作都外围同步块加锁保护
所有操作均为互斥操作,性能比较差,推荐专门实现的线程同步集合
实现
提供两种版本方法,可以从外面传入一个锁,也可以使用自身锁
Collections.java 1 2 3 4 5 6 public static <T> Collection<T> synchronizedCollection (Collection<T> c) { return new SynchronizedCollection<>(c); } static <T> Collection<T> synchronizedCollection (Collection<T> c, Object mutex) { return new SynchronizedCollection<>(c, mutex); }
装饰器类作为静态内类
Collections$SynchronizedCollection.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 static class SynchronizedCollection <E > implements Collection <E >, Serializable { private static final long serialVersionUID = 3053995032091335093L ; final Collection<E> c; final Object mutex; SynchronizedCollection(Collection<E> c) { this .c = Objects.requireNonNull(c); mutex = this ; } SynchronizedCollection(Collection<E> c, Object mutex) { this .c = Objects.requireNonNull(c); this .mutex = Objects.requireNonNull(mutex); } public int size () { synchronized (mutex) {return c.size();} } public boolean isEmpty () { synchronized (mutex) {return c.isEmpty();} } public boolean contains (Object o) { synchronized (mutex) {return c.contains(o);} } public Object[] toArray() { synchronized (mutex) {return c.toArray();} } public <T> T[] toArray(T[] a) { synchronized (mutex) {return c.toArray(a);} } public boolean add (E e) { synchronized (mutex) {return c.add(e);} } public boolean remove (Object o) { synchronized (mutex) {return c.remove(o);} } public boolean containsAll (Collection<?> coll) { synchronized (mutex) {return c.containsAll(coll);} } public boolean addAll (Collection<? extends E> coll) { synchronized (mutex) {return c.addAll(coll);} } public boolean removeAll (Collection<?> coll) { synchronized (mutex) {return c.removeAll(coll);} } public boolean retainAll (Collection<?> coll) { synchronized (mutex) {return c.retainAll(coll);} } public void clear () { synchronized (mutex) {c.clear();} } public String toString () { synchronized (mutex) {return c.toString();} } public Iterator<E> iterator () { return c.iterator(); } @Override public Spliterator<E> spliterator () { return c.spliterator(); } @Override public Stream<E> stream () { return c.stream(); } }
除了通用Collection外,还提供细化集合,实现原理相同
Collections.java 1 2 3 4 5 6 7 8 9 public static <T> List<T> synchronizedList (List<T> list) { return (list instanceof RandomAccess ? new SynchronizedRandomAccessList<>(list) : new SynchronizedList<>(list)); } public static <K,V> Map<K,V> synchronizedMap (Map<K,V> m) { return new SynchronizedMap<>(m); } public static <T> Set<T> synchronizedSet (Set<T> s) { return new SynchronizedSet<>(s); }