diff --git a/pdfbox/src/main/java/org/apache/pdfbox/io/RandomAccessBuffer.java b/pdfbox/src/main/java/org/apache/pdfbox/io/RandomAccessBuffer.java
index b25ee15..0d84484 100644
--- a/pdfbox/src/main/java/org/apache/pdfbox/io/RandomAccessBuffer.java
+++ b/pdfbox/src/main/java/org/apache/pdfbox/io/RandomAccessBuffer.java
@@ -18,7 +18,7 @@ package org.apache.pdfbox.io;
 
 import java.io.Closeable;
 import java.io.IOException;
-import java.util.ArrayList;
+import java.util.concurrent.CopyOnWriteArrayList;
 
 /**
  * An implementation of the RandomAccess interface to store a pdf in memory.
@@ -30,7 +30,7 @@ public class RandomAccessBuffer implements RandomAccess, Closeable, Cloneable
     // chunk size is 16kb
     private static final int BUFFER_SIZE = 16384;
     // list containing all chunks
-    private ArrayList<byte[]> bufferList = null;
+    private CopyOnWriteArrayList<byte[]> bufferList = null;
     // current chunk
     private byte[] currentBuffer;
     // current pointer to the whole buffer
@@ -50,7 +50,7 @@ public class RandomAccessBuffer implements RandomAccess, Closeable, Cloneable
     public RandomAccessBuffer()
     {
         // starting with one chunk
-        bufferList = new ArrayList<byte[]>();
+        bufferList = new CopyOnWriteArrayList<byte[]>();
         currentBuffer = new byte[BUFFER_SIZE];
         bufferList.add(currentBuffer);
         pointer = 0;
@@ -62,25 +62,21 @@ public class RandomAccessBuffer implements RandomAccess, Closeable, Cloneable
 
     @Override
     public RandomAccessBuffer clone() {
-        RandomAccessBuffer copy = new RandomAccessBuffer();
-
-        copy.bufferList = new ArrayList<byte[]>(bufferList.size());
-        for (byte [] buffer : bufferList) {
-            byte [] newBuffer = new byte [buffer.length];
-            System.arraycopy(buffer,0,newBuffer,0,buffer.length);
-            copy.bufferList.add(newBuffer);
-        }
-        if (currentBuffer!=null) {
-            copy.currentBuffer = copy.bufferList.get(copy.bufferList.size()-1);
-        } else {
-            copy.currentBuffer = null;
+        RandomAccessBuffer copy = null;
+        try {
+            copy = (RandomAccessBuffer) super.clone();
+            copy.bufferList = (CopyOnWriteArrayList<byte[]>) bufferList.clone();
+            if (currentBuffer != null) {
+                copy.currentBuffer = copy.bufferList.get(copy.bufferListIndex);
+            } else {
+                copy.currentBuffer = null;
+            }
+        } catch (CloneNotSupportedException e) {
+            /*
+             * Impossible by specification.
+             */
+            throw new InternalError();
         }
-        copy.pointer = pointer;
-        copy.currentBufferPointer = currentBufferPointer;
-        copy.size = size;
-        copy.bufferListIndex = bufferListIndex;
-        copy.bufferListMaxIndex = bufferListMaxIndex;
-
         return copy;
     }
 