最も古いデータを捨てるリスト #2

スレッドセーフではないので少し変更してみた。
ビュー用のリストを得るたびにコピーするのでコストは高そう。
追加のたびにビュー用のコピーを作成するCopyOnWriteArrayList的方法もとれるが、
リストへの追加が多い場合は同様にコストが高くつく。
コピーを返すのでCollections#unmodifiableListで包む必要はないが、
無意味な変更を試みた時に例外を投げるように変更前同様包んだ方がいいのか?

LRAList.java (revised)
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

public class LRAList<E> implements Iterable<E> {
    private LinkedList<E> list = new LinkedList<E>();
    private int capacity;

    public LRAList(int capacity) {
        if (capacity < 0) throw new IllegalArgumentException("negative capacity:" + capacity);
        this.capacity = capacity;
    }

    public synchronized boolean add(E e) {
        if (capacity == 0) return false;
        if (list.size() == capacity) list.removeFirst();
        return list.offer(e);
    }

    public Iterator<E> iterator() {
        return list().iterator();
    }

    public List<E> list() {
        ArrayList<E> cl;
        synchronized (this) {
            cl = new ArrayList<E>(list);
        }
        return cl;
    }
}