CopyOnWriteArraySet :是基于CopyOnWriteArrayList 的实现。只是在添加之前先判断是否已经存储相关记录。
注意:此Set的实现和普通的HashSet 已经相差甚远了。HashSet 是基于HashMap的实现。 从实现的角度就能看出CopyOnWriteArraySet 的使用条件和list的血缘更近,使用的场景也更近!!
它最适合于具有以下特征的应用程序:
set 大小通常保持很小,只读操作远多于可变操作,需要在遍历期间防止线程间的冲突。
它是线程安全的。
因为通常需要复制整个基础数组,所以可变操作(add、set 和 remove 等等)的开销很大。
迭代器不支持可变 remove 操作。
使用迭代器进行遍历的速度很快,并且不会与其他线程发生冲突。在构造迭代器时,迭代器依赖于不变的数组快照。
public class CopyOnWriteArraySet<E> extends AbstractSet<E>
implements java.io.Serializable {
private static final long serialVersionUID = 5457747651344034263L;
//底层是个基于复制的列表,所有CopyOnWriteArrayList 所具有的劣势和优势 他全部具备
private final CopyOnWriteArrayList<E> al;
/**
* Creates an empty set.
*/
public CopyOnWriteArraySet() {
al = new CopyOnWriteArrayList<E>();
}
/**
* Creates a set containing all of the elements of the specified
* collection.
*
* @param c the collection of elements to initially contain
* @throws NullPointerException if the specified collection is null
*/
public CopyOnWriteArraySet(Collection<? extends E> c) {
al = new CopyOnWriteArrayList<E>();
//和list的不同之处
al.addAllAbsent(c);
}
/*
以下操作全部和CopyOnWriteArrayList的效果一样
*/
public int size() {
return al.size();
}
public boolean isEmpty() {
return al.isEmpty();
}
public boolean contains(Object o) {
return al.contains(o);
}
public Object[] toArray() {
return al.toArray();
}
/**底层数组的复制
*/
public <T> T[] toArray(T[] a) {
return al.toArray(a);
}
public void clear() {
al.clear();
}
public boolean remove(Object o) {
return al.remove(o);
}
public boolean add(E e) {
//和CopyOnWriteArrayList 的不同处
return al.addIfAbsent(e);
}
。。。。。。。。。
/**
* 和CopyOnWriteArrayList 一样的快照迭代
*/
public Iterator<E> iterator() {
return al.iterator();
}
}
更多 详细内容请参考 CopyOnWriteArrayList:
http://wangxinchun.iteye.com/blog/1872212 的实现。
分享到:
相关推荐
这使得CopyOnWriteArraySet在并发环境下的性能表现有其独特之处。 CopyOnWriteArraySet的数据结构与CopyOnWriteArrayList类似,都是基于动态数组。CopyOnWriteArraySet通过CopyOnWriteArrayList来存储元素,而...
CopyOnWriteArraySet 是Java中的一个线程安全的集合类,它实现了 Set 接口并使用了"写时复制"的机制。 下面是关于 CopyOnWriteArraySet 的一些重要信息: 线程安全性:CopyOnWriteArraySet 是线程安全的,可以在多...
在多线程环境下,CopyOnWriteArraySet能够在不干扰其他线程读取数据的情况下进行修改操作,从而避免了同步带来的性能影响。 1. **CopyOnWriteArraySet的创建** CopyOnWriteArraySet的构造函数很简单,它内部使用了...
《CopyOnWriteArrayList与CopyOnWriteArraySet源码解析》 CopyOnWriteArrayList与CopyOnWriteArraySet是Java集合框架中的两种线程安全的数据结构,它们在多线程环境下提供了高效且安全的操作。这两个类源自于`java....
`jcip-examples-src.jar`可能包含Java并发编程实战中的各种容器示例,如`BlockingQueue`(阻塞队列)用于线程间的通信,`CopyOnWriteArrayList`和`CopyOnWriteArraySet`提供线程安全的集合操作。 5. **jcip-...
10. **并发集合**:ConcurrentHashMap、CopyOnWriteArrayList和CopyOnWriteArraySet等并发集合类在并发环境下提供了高效且线程安全的数据结构。源码分析有助于理解它们的实现机制和性能优势。 通过对《Java ...
Java并发库还提供了一些线程安全的容器,如`ConcurrentHashMap`、`CopyOnWriteArrayList`和`CopyOnWriteArraySet`等,它们在并发环境下提供了高效且安全的数据存储和访问。 6. **原子类(Atomic)** 原子类如`...
本书涵盖了从基本概念到高级特性的全方位知识,是提升Java并发编程能力的不二之选。 在Java中,多线程是并发编程的基础,它允许程序同时执行多个任务,从而提高系统的利用率和性能。Java 7在并发方面引入了许多改进...
这本书的源码打包提供了丰富的实例,可以帮助读者更好地理解并应用书中所讲解的概念。这里我们将详细解析其中涉及的重要知识点。 首先,Java并发编程的核心是线程,Java 7在多线程处理方面做了很多优化,如引入了...
- `CopyOnWriteArrayList`和`CopyOnWriteArraySet`: 在迭代时提供不变性,适合于读多写少的场景。 - `BlockingQueue`: 阻塞队列,提供线程安全的队列操作,常用于生产者消费者模式。 5. **原子变量** - `...
最后,"并发List、Set、ConcurrentHashMap底层原理剖析"(文件"03")将讨论Java中常用的并发容器,如CopyOnWriteArrayList、CopyOnWriteArraySet和ConcurrentHashMap。这些容器采用了不同的策略来保证线程安全,如...
- **CopyOnWriteArrayList/CopyOnWriteArraySet**:写时复制策略,读操作无锁,写操作复制整个数组,适合读多写少的场景。 5. **线程池**: - **ExecutorService**:Java并发框架的一部分,提供线程池服务,可以...
- **CopyOnWriteArrayList/CopyOnWriteArraySet**:适用于读多写少的情况,读操作无需加锁,写操作则复制整个集合。 7. **源码分析** - PDF文档和源码结合可以帮助读者深入理解多线程设计模式的实际应用,通过...
- **CopyOnWriteArrayList和CopyOnWriteArraySet**:在迭代时不会抛出`ConcurrentModificationException`,适用于读多写少的场景。 - **Atomic*类**:如AtomicInteger、AtomicLong等,提供原子操作的包装类。 5. ...
- **CopyOnWriteArrayList 和 CopyOnWriteArraySet**:这两种集合类在 OpenJDK 7 中得到了优化,减少了内存使用量。 2. **垃圾回收器**: - **Parallel GC**:并行垃圾回收器的性能得到了显著提升。 - **CMS...
CopyOnWriteArraySet 二、:radio::radio::radio:JVM(Java虚拟机) Java虚拟机 (第 06 篇) 深入理解:类文件结构 Java虚拟机 (第 08 篇) 深入理解:打破双亲委派模型 三、:locked_with_key:Java多线程与并发框架...
`CopyOnWriteArrayList`和`CopyOnWriteArraySet`是线程安全的容器,适用于多线程环境,它们在读多写少的场景下表现优秀。 `Vector`类是早期的容器,与`ArrayList`类似,但它是线程安全的。然而,由于同步开销,通常...