Single threaded version:
private final List<Element> list = new ArrayList<Element>();
public Element getElementAt(int index) {
    if (index >= list.size()) {
        for (int i = list.size(); i <= index; i++) {
            list.add(createElement(i));
        }
    }
    return list.get(index);
}
Now I am trying to make a thread-safe version with double checked locking:
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableList.Builder;
...
private volatile List<Element> list = ImmutableList.of();
public Element getElementAt(int index) {
    if (index >= list.size()) {
        synchronized (this) {
            if (index >= list.size()) {
                Builder<Element> newListBuilder = ImmutableList.<Element> builder();
                newListBuilder.addAll(list);
                for (int i = list.size(); i <= index; i++) {
                    newListBuilder.add(createElement(i));
                }
                list = newListBuilder.build();
            }
        }
    }
    return list.get(index);
}
Is this correct?
 
    