集合(四):Collections.synchronizedXX 方法
2015-10-18 11:17
316 查看
在 Collections 工具类中,有几个方法可以把非同步的 Map ,Collection 变成同步的Map,Collection。实现方法看如下源码:
static class SynchronizedCollection<E> implements Collection<E>, Serializable { private static final long serialVersionUID = 3053995032091335093L; final Collection<E> c; // Backing Collection final Object mutex; // Object on which to synchronize 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 Iterator<E> iterator() { return c.iterator(); // Must be manually synched by user! } 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();} } // Override default methods in Collection @Override public void forEach(Consumer<? super E> consumer) { synchronized (mutex) {c.forEach(consumer);} } @Override public boolean removeIf(Predicate<? super E> filter) { synchronized (mutex) {return c.removeIf(filter);} } @Override public Spliterator<E> spliterator() { return c.spliterator(); // Must be manually synched by user! } @Override public Stream<E> stream() { return c.stream(); // Must be manually synched by user! } @Override public Stream<E> parallelStream() { return c.parallelStream(); // Must be manually synched by user! } private void writeObject(ObjectOutputStream s) throws IOException { synchronized (mutex) {s.defaultWriteObject();} } }
相关文章推荐
- Java中使用synchronized关键字实现简单同步操作示例
- 深入Synchronized和java.util.concurrent.locks.Lock的区别详解
- 举例讲解Java中synchronized关键字的用法
- java基本教程之synchronized关键字 java多线程教程
- java多线程编程之使用Synchronized块同步方法
- java多线程编程之使用Synchronized关键字同步类方法
- java多线程编程之使用Synchronized块同步变量
- 深入理解java中的synchronized关键字
- Python collections模块实例讲解
- Java synchronized用法
- java中synchronized的用法详解
- Collections.sort
- Java之voliate, synchronized, AtomicInteger使用
- 多线程 Synchronized 的注意细节
- java中Collections.sort() 排序函数的两种用法
- Java中的ReentrantLock和synchronized两种锁定机制的对比
- java synchronized详解
- 多线程 wait sleep synchronized
- 【Java基础】多线程中同步的两种解决方案
- synchronized,ReetrantLock与volatile(一)