code: @Override
      public List<E> subList(int fromIndex, int toIndex) {
          final ReentrantLock lock = this.lock;
          lock.lock();
          try {
              Object[] elements = getArray();
              int len = elements.length;
              if (fromIndex < 0 || toIndex > len || fromIndex > toIndex)
                  throw new IndexOutOfBoundsException();
              return new COWSubList<E>(this, fromIndex, toIndex);
          } finally {
              lock.unlock();
          }
      }
docs: Returns a view of the portion of this list between
  <tt>fromIndex</tt>, inclusive, and <tt>toIndex</tt>, exclusive.
  The returned list is backed by this list, so changes in the
  returned list are reflected in this list.
  
  <p>The semantics of the list returned by this method become
  undefined if the backing list (i.e., this list) is modified in
  any way other than via the returned list.
  
  @param fromIndex low endpoint (inclusive) of the subList
  @param toIndex high endpoint (exclusive) of the subList
  @return a view of the specified range within this list
  @throws IndexOutOfBoundsException {@inheritDoc}