diff --git a/core/java/src/net/i2p/util/ReusableGZIPInputStream.java b/core/java/src/net/i2p/util/ReusableGZIPInputStream.java
index a24ad1282967f3468cc37af8f97dca7d78adb9f1..229814de9edaab69da18b04f6adc5e623fed2a91 100644
--- a/core/java/src/net/i2p/util/ReusableGZIPInputStream.java
+++ b/core/java/src/net/i2p/util/ReusableGZIPInputStream.java
@@ -3,8 +3,8 @@ package net.i2p.util;
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
-import java.util.ArrayList;
 import java.util.zip.GZIPOutputStream;
+import java.util.concurrent.LinkedBlockingQueue;
 
 import net.i2p.data.DataHelper;
 
@@ -14,16 +14,24 @@ import net.i2p.data.DataHelper;
  *
  */
 public class ReusableGZIPInputStream extends ResettableGZIPInputStream {
-    private final static ArrayList _available = new ArrayList(8);
+    // Apache Harmony 5.0M13 Deflater doesn't work after reset()
+    private static final boolean ENABLE_CACHING = !System.getProperty("java.vendor").startsWith("Apache");
+    private static final LinkedBlockingQueue<ReusableGZIPInputStream> _available;
+    static {
+        if (ENABLE_CACHING)
+            _available = new LinkedBlockingQueue(8);
+        else
+            _available = null;
+    }
+
     /**
      * Pull a cached instance
      */
     public static ReusableGZIPInputStream acquire() {
         ReusableGZIPInputStream rv = null;
-        synchronized (_available) {
-            if (_available.size() > 0)
-                rv = (ReusableGZIPInputStream)_available.remove(0);
-        }
+        // Apache Harmony 5.0M13 Deflater doesn't work after reset()
+        if (ENABLE_CACHING)
+            rv = _available.poll();
         if (rv == null) {
             rv = new ReusableGZIPInputStream();
         } 
@@ -34,10 +42,8 @@ public class ReusableGZIPInputStream extends ResettableGZIPInputStream {
      * state)
      */
     public static void release(ReusableGZIPInputStream released) {
-        synchronized (_available) {
-            if (_available.size() < 8)
-                _available.add(released);
-        }
+        if (ENABLE_CACHING)
+            _available.offer(released);
     }
     
     private ReusableGZIPInputStream() { super(); }
diff --git a/core/java/src/net/i2p/util/ReusableGZIPOutputStream.java b/core/java/src/net/i2p/util/ReusableGZIPOutputStream.java
index 42297964826868ac2efb7f4fbe28a878d827ce9c..97680ecafbf6e0abab5fc5695796a16c8d0f40ef 100644
--- a/core/java/src/net/i2p/util/ReusableGZIPOutputStream.java
+++ b/core/java/src/net/i2p/util/ReusableGZIPOutputStream.java
@@ -2,9 +2,9 @@ package net.i2p.util;
 
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
-import java.util.ArrayList;
 import java.util.zip.Deflater;
 import java.util.zip.GZIPInputStream;
+import java.util.concurrent.LinkedBlockingQueue;
 
 import net.i2p.data.DataHelper;
 
@@ -14,16 +14,23 @@ import net.i2p.data.DataHelper;
  *
  */
 public class ReusableGZIPOutputStream extends ResettableGZIPOutputStream {
-    private static final ArrayList _available = new ArrayList(16);
+    // Apache Harmony 5.0M13 Deflater doesn't work after reset()
+    private static final boolean ENABLE_CACHING = !System.getProperty("java.vendor").startsWith("Apache");
+    private static final LinkedBlockingQueue<ReusableGZIPOutputStream> _available;
+    static {
+        if (ENABLE_CACHING)
+            _available = new LinkedBlockingQueue(16);
+        else
+            _available = null;
+    }
+
     /**
      * Pull a cached instance
      */
     public static ReusableGZIPOutputStream acquire() {
         ReusableGZIPOutputStream rv = null;
-        synchronized (_available) {
-            if (_available.size() > 0)
-                rv = (ReusableGZIPOutputStream)_available.remove(0);
-        }
+        if (ENABLE_CACHING)
+            rv = _available.poll();
         if (rv == null) {
             rv = new ReusableGZIPOutputStream();
         } 
@@ -36,10 +43,8 @@ public class ReusableGZIPOutputStream extends ResettableGZIPOutputStream {
      */
     public static void release(ReusableGZIPOutputStream out) {
         out.reset();
-        synchronized (_available) {
-            if (_available.size() < 16)
-                _available.add(out);
-        }
+        if (ENABLE_CACHING)
+            _available.offer(out);
     }
     
     private ByteArrayOutputStream _buffer = null;