package com.neocoretechs.bigsack; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantReadWriteLock; import com.neocoretechs.bigsack.io.pooled.BlockAccessIndex; public class ConcurrentArrayList<T> { /** use this to lock for write operations like add/remove */ private final Lock readLock; /** use this to lock for read operations like get/iterator/contains.. */ private final Lock writeLock; /** the underlying list*/ private final List<T> list; public ConcurrentArrayList() { this(10); } public ConcurrentArrayList(int pOOLBLOCKS) { list = new ArrayList<T>(pOOLBLOCKS); ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock(); readLock = rwLock.readLock(); writeLock = rwLock.writeLock(); } public void add(T e){ writeLock.lock(); try{ list.add(e); }finally{ writeLock.unlock(); } } public void get(int index){ readLock.lock(); try{ list.get(index); }finally{ readLock.unlock(); } } public Iterator<T> iterator(){ readLock.lock(); try { return new ArrayList<T>( list ).iterator(); //^ we iterate over an snapshot of our list } finally{ readLock.unlock(); } } public T remove(int i) { writeLock.lock(); try { return list.remove(i); } finally { writeLock.unlock(); } } public int size() { readLock.lock(); try { return list.size(); } finally{ readLock.unlock(); } } }