Ответ 1
В вашем случае вы можете использовать ReadWriteLock для доступа к резервному списку, это позволяет нескольким потокам читать ваш список. Только если один поток нуждается в доступе на запись, все считыватели-Thread должны дождаться завершения операции. JavaDoc дает понять:
ReadWriteLock поддерживает пару связанных блокировок, один для только для чтения и один для записи. Блокировка чтения может быть сохранена одновременно несколькими потоками считывателей, если нет писатели. Блокировка записи является эксклюзивной.
Вот пример:
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 = new ArrayList();
{
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();
}
}