相关文章
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中,CopyOnWriteArrayList(写入时复制数组列表)是线程安全的集合类,它实现了List接口,并使用了"写入时复制"的策略来保证线程安全性。 CopyOnWriteArrayList的主要特点是:在进行修改操作(例如添加、修改...
高并发的情况下,一般都要求性能要给力,Vector 显然不够格,所以被遗忘在角落也是“罪有应得”啊。 SynchronizedList 那有些同学可能会说,可以使用 Collections.synchronizedList() 让 ArrayList 变成线程安全啊...
1. CopyOnWriteArrayList的简介 2. COW的设计思想 3. CopyOnWriteArrayList的实现原理 4. 总结 2.读线程间
CopyOnWriteArrayList是ArrayList的线程安全版本,从名字推测,CopyOnWriteArrayList是在有写操作的时候会copy一份数据,然后写完再设置成新的数据。CopyOnWriteArrayList适用于读多写少的并发场景。而...
1、CopyOnWriteArrayList位于java.util.concurrent包下,可想而知,这个类是为并发而设计的 2、CopyOnWriteArr
今天小编就为大家分享一篇关于Java源码解析CopyOnWriteArrayList的讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
下面小编就为大家带来一篇基于CopyOnWriteArrayList并发容器(实例讲解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
目前上传的是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黄埔军校
Java 多线程与并发(14_26)-JUC集合_ CopyOnWriteArrayList详解
今天不看源码(想看源码的同学可以自己在本机进行查阅),只是大概说一下这三者的区别。方便大家能够在面试的时候说出这三者的不同。 ArrayList方面 ArrayList简介: ArrayList是一种以数组实现的List,它实现了...
ArrayList 是我们常用的工具类之一,但是在多线程的情况下,ArrayList 作为共享变量时,并不是线程安全的。主要有以下两个原因: 1、ArrayList 自身的 ...用 JUC 下的 CopyOnWriteArrayList ; 先来看看 Synchron
run_ver3.zip
private CopyOnWriteArrayList<Book> bookList= new CopyOnWriteArrayList(); private Binder binder = new IBookManager.Stub(){ @Override public List<Book> getBookList() throws RemoteException { return...
hashmap扩容时每个entry需要再计算一次hash吗? hashmap的数组长度为什么要保证是2的幂? 如何用LinkedHashMap实现LRU? 如何用TreeMap实现一致性hash? ConcurrentHashMap是如何在保证并发安全的同时提高性能? ...