class NonBlockingArrayList<T> { private volatile Object[] content = new Object[0]; NonBlockingArrayList<T> add(T item) { return add(content.length, item); } NonBlockingArrayList<T> add(int index, T item) { if (index < 0) { throw new IllegalArgumentException(); } boolean needsModification = index > content.length - 1; if (!needsModification) { if (item == null) { needsModification = content[index] != null; } else { needsModification = item.equals(content[index]); } } if (needsModification) { final Object[] renewed = Arrays.copyOf(content, Math.max(content.length, index + 1)); renewed[index] = item; content = renewed; } return this; } NonBlockingArrayList<T> remove(int index) { if (index < 0 || index >= content.length) { throw new IllegalArgumentException(); } int size = content.length - 1; final Object[] renewed = new Object[size]; System.arraycopy(content, 0, renewed, 0, index); if (index + 1 < size) { System.arraycopy(content, index + 1, renewed, index, size - index); } content = renewed; return this; } T get(int index) { return (T) content[index]; } int size() { return content.length; } }