This is an automated email from the ASF dual-hosted git repository. bodewig pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/commons-compress.git
commit e2175822cbc0d13ed1f17fd0be2ac790bf7f93c9 Author: tibordigana <tibordig...@apache.org> AuthorDate: Sun May 12 00:50:40 2019 +0200 Substituting 'synchronized' with faster and fully thread-safe collections 'ConcurrentLinkedDeque' and iterators. --- .../archivers/zip/ParallelScatterZipCreator.java | 36 +++++++++------------- 1 file changed, 15 insertions(+), 21 deletions(-) diff --git a/src/main/java/org/apache/commons/compress/archivers/zip/ParallelScatterZipCreator.java b/src/main/java/org/apache/commons/compress/archivers/zip/ParallelScatterZipCreator.java index c5010c0..dd95882 100644 --- a/src/main/java/org/apache/commons/compress/archivers/zip/ParallelScatterZipCreator.java +++ b/src/main/java/org/apache/commons/compress/archivers/zip/ParallelScatterZipCreator.java @@ -24,9 +24,9 @@ import org.apache.commons.compress.parallel.ScatterGatherBackingStoreSupplier; import java.io.File; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; +import java.util.Deque; import java.util.concurrent.Callable; +import java.util.concurrent.ConcurrentLinkedDeque; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -35,7 +35,6 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import java.util.zip.Deflater; -import static java.util.Collections.synchronizedList; import static org.apache.commons.compress.archivers.zip.ZipArchiveEntryRequest.createZipArchiveEntryRequest; /** @@ -52,10 +51,10 @@ import static org.apache.commons.compress.archivers.zip.ZipArchiveEntryRequest.c * @since 1.10 */ public class ParallelScatterZipCreator { - private final List<ScatterZipOutputStream> streams = synchronizedList(new ArrayList<ScatterZipOutputStream>()); + private final Deque<ScatterZipOutputStream> streams = new ConcurrentLinkedDeque<>(); private final ExecutorService es; private final ScatterGatherBackingStoreSupplier backingStoreSupplier; - private final List<Future<ScatterZipOutputStream>> futures = new ArrayList<>(); + private final Deque<Future<ScatterZipOutputStream>> futures = new ConcurrentLinkedDeque<>(); private final long startedAt = System.currentTimeMillis(); private long compressionDoneAt = 0; @@ -256,16 +255,13 @@ public class ParallelScatterZipCreator { // It is important that all threads terminate before we go on, ensure happens-before relationship compressionDoneAt = System.currentTimeMillis(); - synchronized (streams) { - // write zip entries in the order they were added (kept as futures) - for (final Future<ScatterZipOutputStream> future : futures) { - ScatterZipOutputStream scatterStream = future.get(); - scatterStream.zipEntryWriter().writeNextZipEntry(targetStream); - } + for (final Future<ScatterZipOutputStream> future : futures) { + ScatterZipOutputStream scatterStream = future.get(); + scatterStream.zipEntryWriter().writeNextZipEntry(targetStream); + } - for (final ScatterZipOutputStream scatterStream : streams) { - scatterStream.close(); - } + for (final ScatterZipOutputStream scatterStream : streams) { + scatterStream.close(); } scatterDoneAt = System.currentTimeMillis(); @@ -284,13 +280,11 @@ public class ParallelScatterZipCreator { } private void closeAll() { - synchronized (streams) { - for (final ScatterZipOutputStream scatterStream : streams) { - try { - scatterStream.close(); - } catch (IOException ex) { //NOSONAR - // no way to properly log this - } + for (final ScatterZipOutputStream scatterStream : streams) { + try { + scatterStream.close(); + } catch (IOException ex) { //NOSONAR + // no way to properly log this } } }