相关文章
http://wangxinchun.iteye.com/blog/1872212
CopyOnWriteArrayList 适合读频繁,写不频繁的情况,最重要的是如果list中的数据量非常大,请不要使用这个,那在写的时候复制到代价将会非常大。
这时可以考虑使用Vector 或者collections.synchronizedlist 。
但是这样读和读之间依然是互斥的,性能肯定差。
下面这个实现通过读写锁分离的思想,很简单的可以实现读和读是并行的,读和写是互斥的,写和写是互斥的。
如果有问题,请指正~
源码如下:
package cn.javaframe.validator;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
/**
* @author xinchun.wang
*/
public class ReadWriteLockArrayList<T> {
private List<T> list = new ArrayList<T>();
private ReadWriteLock lock = new ReentrantReadWriteLock();
private Lock writeLock = lock.writeLock();
private Lock readLock = lock.readLock();
public int size() {
readLock.lock();
try {
return list.size();
} finally {
readLock.unlock();
}
}
public boolean isEmpty() {
readLock.lock();
try {
return list.isEmpty();
} finally {
readLock.unlock();
}
}
public boolean contains(Object o) {
readLock.lock();
try {
return list.contains(o);
} finally {
readLock.unlock();
}
}
public Iterator<T> iterator() {
throw new UnsupportedOperationException();
}
public Object[] toArray() {
readLock.lock();
try {
return list.toArray();
} finally {
readLock.unlock();
}
}
public boolean add(T e) {
writeLock.lock();
try {
return list.add(e);
} finally {
writeLock.unlock();
}
}
public boolean remove(T o) {
writeLock.lock();
try {
return list.remove(o);
} finally {
writeLock.unlock();
}
}
public void clear() {
writeLock.lock();
try {
list.clear();
} finally {
writeLock.unlock();
}
}
public T get(int index) {
readLock.lock();
try {
return list.get(index);
} finally {
readLock.unlock();
}
}
public T remove(int index) {
writeLock.lock();
try {
return list.remove(index);
} finally {
writeLock.unlock();
}
}
public int indexOf(Object o) {
readLock.lock();
try {
return list.indexOf(o);
} finally {
readLock.unlock();
}
}
public int lastIndexOf(Object o) {
readLock.lock();
try {
return list.lastIndexOf(o);
} finally {
readLock.unlock();
}
}
public boolean addAll(Collection<? extends T> c) {
writeLock.lock();
try {
return list.addAll(c);
} finally {
writeLock.unlock();
}
}
public boolean addAll(int index, Collection<? extends T> c) {
writeLock.lock();
try {
return list.addAll(index, c);
} finally {
writeLock.unlock();
}
}
public boolean removeAll(Collection<?> c) {
writeLock.lock();
try {
return list.removeAll(c);
} finally {
writeLock.unlock();
}
}
public T set(int index, T element) {
writeLock.lock();
try {
return list.set(index, element);
} finally {
writeLock.unlock();
}
}
public void add(int index, T element) {
writeLock.lock();
try {
list.add(index, element);
} finally {
writeLock.unlock();
}
}
}
分享到:
相关推荐
Java并发容器CopyOnWriteArrayList实现原理及源码分析 Java并发容器CopyOnWriteArrayList是Java并发包中提供的一个并发容器,实现了线程安全且读操作无锁的ArrayList,写操作则通过创建底层数组的新副本来实现。...
java遍历时可修改的容器CopyOnWriteArrayList
Java中的`CopyOnWriteArrayList`是一个线程安全的列表实现,特别适合于高并发环境下的读多写少的场景。这个类的名字暗示了其工作原理:在修改(写入)时复制原有的数组,然后在新的数组上进行操作,最后将新数组替换...
在Java的并发编程中,CopyOnWriteArrayList 是一个重要的线程安全集合类,它通过写时复制(Copy-On-Write)机制实现了高效的读操作。本文将详细探讨 CopyOnWriteArrayList 的工作原理、优缺点、适用场景以及代码示例...
CopyOnWriteArrayList是Java集合框架中的一个特殊列表,位于`java.util.concurrent`包下,专为并发编程场景设计。它的核心特性在于写时复制(Copy-On-Write)策略,这使得它在多线程环境下提供了良好的性能表现。当...
CopyOnWriteArrayList的实现原理是在添加元素时,先将当前容器进行Copy,复制出一个新的容器,然后新的容器里添加元素,添加完元素之后,再将原容器的引用指向新的容器。这样做的好处是我们可以对...
在Java中,CopyOnWriteArrayList(写入时复制数组列表)是线程安全的集合类,它实现了List接口,并使用了"写入时复制"的策略来保证线程安全性。 CopyOnWriteArrayList的主要特点是:在进行修改操作(例如添加、修改...
Java源码解析CopyOnWriteArrayList的讲解 Java源码解析CopyOnWriteArrayList是Java集合框架中一个非常重要的组件,它提供了一个线程安全的ArrayList变种,用于处理大量读取操作和少量写入操作的场景。在本文中,...
1. CopyOnWriteArrayList的简介 2. COW的设计思想 3. CopyOnWriteArrayList的实现原理 4. 总结 2.读线程间
### Java多线程与并发(14-26)-JUC集合-CopyOnWriteArrayList详解 #### 一、概述 `CopyOnWriteArrayList`是一种线程安全的集合类,它是`ArrayList`的一种特殊版本,主要通过复制底层数组的方式来保证线程安全性。...
目前上传的是CopyOnWriteArrayList.uml类图,包含该类的各个extends、implements的接口或者类
java中,List在遍历的时候,如果被修改了会抛出java.util.ConcurrentModificationException错误。 看如下代码: import java.util.ArrayList; import java.util.List; public class Resource3 { ...
Java concurrency集合之 CopyOnWriteArrayList_动力节点Java学院整理,动力节点口口相传的Java黄埔军校
CopyOnWriteArrayList是Java集合框架中的一个重要类,它是ArrayList的线程安全版本,特别适合于读多写少的并发场景。这个类通过一种称为“写时复制”(Copy-On-Write)的技术实现了读写分离,确保了在进行写操作时不会...
今天不看源码(想看源码的同学可以自己在本机进行查阅),只是大概说一下这三者的区别。方便大家能够在面试的时候说出这三者的不同。 ArrayList方面 ArrayList简介: ArrayList是一种以数组实现的List,它实现了...
6. **线程安全类**:Java集合框架中有许多线程安全的类,如Vector、ConcurrentHashMap、CopyOnWriteArrayList等,它们内部实现了同步机制,可以在多线程环境中安全使用。 二、基于Http协议的断点续传 1. **HTTP...
3. 使用线程安全的集合类:如ConcurrentHashMap、CopyOnWriteArrayList等,它们在内部实现了线程安全的同步机制。 4. Lock和Condition:Java提供Lock接口和Condition接口,提供了更细粒度的锁控制和线程间通信,...
《CopyOnWriteArrayList与CopyOnWriteArraySet源码解析》 CopyOnWriteArrayList与CopyOnWriteArraySet是Java集合框架中的两种线程安全的数据结构,它们在多线程环境下提供了高效且安全的操作。这两个类源自于`java....