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;